java 日期操作类

JDK1.8以前使用 Date 可读性差

而且需要配合simpleDateFormat,但simpleDateFormat是线程不安全的(是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。日期格式不同步,多线程环境下,必须在外部进行同步。)

JDK1.8 提供了LocalDate,LocalTime,LocalDateTime

LocalDate 不可变(final修饰)线程安全
  • LocalDate是一个不可变的日期时间对象,表示日期,通常被视为年月日。 也可以访问其他日期字段,例如日期,星期几和星期。 例如,值“2007年10月2日”可存储在LocalDate

    该类不存储或表示时间或时区。 相反,它是日期的描述,用于生日。 它不能代表时间线上的即时信息,而没有附加信息,如偏移或时区。

    使用身份敏感的操作(包括引用相等(的==上的实例),标识哈希码,或同步) LocalDate可具有不可预测的结果,应当避免。 equals方法应用于比较。

Fields 最大值和最小值

public static final LocalDate MIN = LocalDate.of(Year.MIN_VALUE, 1, 1); //最低支持 LocalDate ,'-999999999-01-01'。
/**
 * The maximum supported {@code LocalDate}, '+999999999-12-31'.
 * This could be used by an application as a "far future" date.
 */
public static final LocalDate MAX = LocalDate.of(Year.MAX_VALUE, 12, 31);//最大支持 LocalDate '''999999999-12-31'。 
//获取当前时间
LocalDate now = LocalDate.now();
System.out.println(now);
//设置日期
LocalDate localDate = LocalDate.of(2021, 5, 7);
System.out.println(localDate);
//获取年
int year = localDate.getYear();
int year1 = localDate.get(ChronoField.YEAR);
System.out.println("getYear()"+year);
System.out.println("ChronoField"+year1);


//获取月
Month month = localDate.getMonth();   // 结果:SEPTEMBER
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR); //结果:9

System.out.println(month);
System.out.println(month1);

//获取日
int day = localDate.getDayOfMonth();   //结果:10
int day1 = localDate.get(ChronoField.DAY_OF_MONTH); // 结果:10

System.out.println(day);
System.out.println(day1);

//获取星期数
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
System.out.println(dayOfWeek);
System.out.println(dayOfWeek1);

还有其他常用的方法 可以jdk文档查阅

例如

      • public static LocalDate of(int year,
                                   Month month,
                                   int dayOfMonth)
        

        从一年,一个月和一天获得一个LocalDate的实例。

        这将返回一个LocalDate与指定的年,月和日。 该日期必须在年和月中有效,否则将抛出异常。

        • 参数

          year - 从MIN_YEAR到MAX_YEAR的年份

          month - 代表的月份,不为空

          dayOfMonth - 代表从1到31的月份

equals(); 只是LocalDate对象之间比较,类型不一致返回false

LocalTime
  • LocalTime是一个不可变的日期时间对象,代表一个时间,通常被看作是小时 - 秒。 时间表示为纳秒精度。 例如,值“13:45.30.123456789”可以存储在LocalTime

    它不存储或表示日期或时区。 相反,它是在挂钟上看到的当地时间的描述。 它不能代表时间线上的即时信息,而没有附加信息,如偏移或时区。

    使用身份敏感的操作(包括引用相等(的==上的实例),标识哈希码,或同步) LocalTime可具有不可预测的结果,应当避免。 应使用equals方法进行比较。

  •     // 获取当前时间
            LocalTime localTimeNow = LocalTime.now();
    // 设置时间
            LocalTime localTime = LocalTime.of(13, 51, 10);
    //获取小时
            int hour = localTime.getHour();    // 结果:13
            int hour1 = localTime.get(ChronoField.HOUR_OF_DAY); // 结果:13
            System.out.println(hour);
            System.out.println(hour1);
    //获取分
            int minute = localTime.getMinute();  // 结果:51
            int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR); // 结果:51
            System.out.println(minute);
            System.out.println(minute1);
    //获取秒
            int second = localTime.getSecond();   // 结果:10
            int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE); // 结果:10
            System.out.println(second);
            System.out.println(second1);
    
LocalDateTime 相当于LocalDate+LocalTime
LocalDateTime localDateTime = LocalDateTime.now();
 // 设置日期
 LocalDateTime localDateTime1 = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56);
 LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
 LocalDateTime localDateTime3 = localDate.atTime(localTime);
 LocalDateTime localDateTime4 = localTime.atDate(localDate);
 System.out.println(localDateTime1);
 System.out.println(localDateTime2);
 System.out.println(localDateTime3);
 System.out.println(localDateTime4);
 // 获取LocalDate
 LocalDate localDate2 = localDateTime.toLocalDate();
// 获取LocalTime
 LocalTime localTime2 = localDateTime.toLocalTime();

通过PLus方法 增加 指定 年 月 日 分 秒

LocalDateTime localDateTime = LocalDateTime.of(2019,2,10,14,16,56);
localDateTime = localDateTime.plusYears(1);
System.out.println(localDateTime);    //2020-02-10T14:16:56
localDateTime = localDateTime.plus(1, ChronoUnit.YEARS); //2021-02-10T14:16:56

通过with修改某些值,年月日时分秒都可以通过with方法设置

localDateTime = localDateTime.withYear(2019);
System.out.println(localDateTime);

System.out.println(localDateTime.getDayOfWeek());

localDateTime = localDateTime.with(ChronoField.DAY_OF_WEEK,5);
System.out.println(localDateTime);

格式化时间

LocalDate localDate = LocalDateTime.now().toLocalDate();
localDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
System.out.println(localDate);  //和SimpleDateFormat相比,DateTimeFormatter是线程安全的

SpringBoot中应用LocalDateTime

将LocalDateTime字段以时间戳的方式返回给前端 添加日期转化类

    public class LocalDateTimeConverter extends JsonSerializer<LocalDateTime> {
        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeNumber(value.toInstant(ZoneOffset.of("+8")).toEpochMilli());
        }
    }

并在LocalDateTime字段上添加@JsonSerialize(using = LocalDateTimeConverter.class)注解,如下:

@JsonSerialize(using = LocalDateTimeConverter.class)
protected LocalDateTime gmtModified;

将LocalDateTime字段以指定格式化日期的方式返回给前端 在LocalDateTime字段上添加@JsonFormat(shape=JsonFormat.Shape.STRING, pattern=“yyyy-MM-dd HH:mm:ss”)注解即可,如下:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;

对前端传入的日期进行格式化 在LocalDateTime字段上添加@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)注解即可,如下:

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值