日期类工具 DataUtil
public class DateUtils {
public static final ZoneOffset BJ_ZONE = ZoneOffset.of("+8");
public static final long MILLI_SECOND_EXCHANGE_TIME_base = 1000L;
public static Long getSecondsNextEarlyMorning() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
}
public static String dateToString(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
return sdf.format(date);
}
public static Date getDayBegin() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);// 0点
cal.set(Calendar.MINUTE, 0);// 0分
cal.set(Calendar.SECOND, 0);// 0秒
cal.set(Calendar.MILLISECOND, 0);// 0毫秒
return cal.getTime();
}
public static List findDates(Date startTime, Date endTime) {
Calendar cStart = Calendar.getInstance();
cStart.setTime(startTime);
cStart.set(Calendar.HOUR_OF_DAY, 0);
cStart.set(Calendar.SECOND, 0);
cStart.set(Calendar.MINUTE, 0);
cStart.set(Calendar.MILLISECOND, 0);
List dateList = new ArrayList<>();
//起始日期加上
dateList.add(cStart.getTime().getTime() / 1000L);
// 此日期是否在指定日期之后
while (endTime.after(cStart.getTime())) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
cStart.add(Calendar.DAY_OF_MONTH, 1);
dateList.add(cStart.getTime().getTime() / 1000L);
}
if (!CollectionUtils.isEmpty(dateList)){
dateList.remove(dateList.size()-1);
}
return dateList;
}
public static Date getBeginDayOfYesterday() {
Calendar cal = Calendar.getInstance();
cal.setTime(getDayBegin());// 当天开始时间
cal.add(Calendar.DAY_OF_MONTH, -1);// 当天月份天数减1
return cal.getTime();
}
public static Date getEndDayOfYesterday() {
Calendar cal = Calendar.getInstance();
cal.setTime(getDayEnd());// 当天结束时间
cal.add(Calendar.DAY_OF_MONTH, -1);// 当天月份天数减1
return cal.getTime();
}
public static Date getBeginDayOfTomorrow() {
Calendar cal = Calendar.getInstance();
cal.setTime(getDayBegin());// 当天开始时间
cal.add(Calendar.DAY_OF_MONTH, 1);// 当天月份天数加1
return cal.getTime();
}
public static Date getEndDayOfTomorrow() {
Calendar cal = Calendar.getInstance();
cal.setTime(getDayEnd());// 当天结束时间
cal.add(Calendar.DAY_OF_MONTH, 1);// 当天月份天数加1
return cal.getTime();
}
public static Date getDayEnd() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 23);// 23点
cal.set(Calendar.MINUTE, 59);// 59分
cal.set(Calendar.SECOND, 59);// 59秒
return cal.getTime();
}
private final static DateTimeFormatter YYYY_MM = DateTimeFormatter.ofPattern("yyyyMM");
public static Date localDateToDate(@NonNull LocalDate localDate) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
return Date.from(instant);
}
public static LocalDate dateToLocalDate(@NonNull Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalDate();
}
public static LocalDate firstDayOfCurrentMonth() {
LocalDate localDate = LocalDate.now();
return LocalDate.of(localDate.getYear(), localDate.getMonthValue(), 1);
}
public static LocalDate nextMonthToday(LocalDate target) {
return target.plusMonths(1L);
}
public static LocalDate lastMonthToday(LocalDate target) {
return target.plusMonths(-1L);
}
public static LocalDate nextDay(LocalDate target) {
return target.plusDays(1L);
}
public static LocalDate lastDayOfCurrentMonth() {
return lastDayOfTargetMonth(LocalDate.now());
}
public static LocalDate firstDayOfTargetMonth(LocalDate targetDate) {
return LocalDate.of(targetDate.getYear(), targetDate.getMonthValue(), 1);
}
public static LocalDate lastDayOfTargetMonth(LocalDate targetDate) {
return targetDate.with(TemporalAdjusters.lastDayOfMonth());
}
public static LocalDate firstDayOfNextMonth(LocalDate targetDate) {
targetDate = targetDate.plusMonths(1L);
return LocalDate.of(targetDate.getYear(), targetDate.getMonthValue(), 1);
}
public static LocalDate lastDayOfNextMonth(LocalDate targetDate) {
return targetDate.plusMonths(1L).with(TemporalAdjusters.lastDayOfMonth());
}
public static int totalDaysOfMonth(LocalDate localDate) {
return lastDayOfTargetMonth(localDate).getDayOfMonth();
}
public static int intervalDays(LocalDate start, LocalDate end) {
return Period.between(start, end).plusDays(1L).getDays();
}
public static boolean isSameMonth(LocalDate source, LocalDate target) {
return YearMonth.from(source).equals(YearMonth.from(target));
}
public static String formatYYYYMM(LocalDate localDate) {
return localDate.format(YYYY_MM);
}
public static YearMonth toYearMonth(String str) {
return YearMonth.parse(str, YYYY_MM);
}
public static void main(String[] args) {
LocalDate start = LocalDate.of(2021, 8, 10);
LocalDate end = LocalDate.of(2021, 9, 1);
System.out.println(lastDayOfCurrentMonth());
System.out.println(firstDayOfTargetMonth(start));
System.out.println(totalDaysOfMonth(LocalDate.now()));
System.out.println(totalDaysOfMonth(start));
System.out.println(totalDaysOfMonth(end));
System.out.println(LocalDate.now().getMonth() == start.getMonth());
System.out.println(LocalDate.now().plusMonths(1L));
System.out.println(intervalDays(start, end));
System.out.println(Period.between(start, end).getMonths());
System.out.println(YearMonth.from(start).equals(YearMonth.from(end)));
System.out.println(formatYYYYMM(LocalDate.now()));
System.out.println(toYearMonth(formatYYYYMM(LocalDate.now())));
System.out.println(toYearMonth(formatYYYYMM(LocalDate.now())).atDay(1));
}
}
手机号码正则校验
正则表达式
package com.ruqimobility.user.constant;
import java.util.regex.Pattern;
public abstract class RegularConst {
private static final String TELEPHONE = "^1(?:3\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\d|9\d)\d{8}$";
public static final Pattern PHONE_PATTERN = Pattern.compile(TELEPHONE);
}
实体类字段贴上@phone注解, 会进行自动校验
package com.ruqimobility.user.request;
import com.ruqimobility.user.annotation.Phone;
import com.ruqimobility.user.dtos.TripShareSetting;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CreateEmergencyContactRequest {
@NotNull(message = "用户ID必填")
@ApiModelProperty(value = "用户ID", required = true)
private Long userId;
@Phone(ignoreEmpty = false)
@ApiModelProperty(value = "联系人手机号码", required = true)
private String phone;
@NotBlank(message = "联系人姓名必填")
@ApiModelProperty(value = "联系人姓名", required = true)
private String name;
@ApiModelProperty(value = "操作者名称")
private String operator;
@NotNull(message = "必须设置自动分享行程参数")
@ApiModelProperty(value = "是否自动分享行程,1分享,0不分享", required = true)
private Boolean enableTripShare = false;
@ApiModelProperty(value = "行程分享设置内容")
private TripShareSetting tripShareSetting;
}
使用phone注解的方式
package com.ruqimobility.user.annotation;
import com.ruqimobility.user.constant.RegularConst;
import org.springframework.util.StringUtils;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
import java.util.regex.Matcher;
@documented
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {Phone.Phonevalidator.class})
public @interface Phone {
String message() default "手机号码不正确";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
boolean ignoreEmpty() default true;
class Phonevalidator implements ConstraintValidator {
private Phone annotation;
@Override
public void initialize(Phone annotation) {
this.annotation = annotation;
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//如果配置忽略空值且传的是空值,则默认通过校验
if (annotation.ignoreEmpty() && StringUtils.isEmpty(value)) {
return true;
}
if (!annotation.ignoreEmpty() && StringUtils.isEmpty(value)) {
return false;
}
Matcher matcher = RegularConst.PHONE_PATTERN.matcher(value);
return matcher.matches();
}
}
}



