NET2Java之四:日期处理

日期操作是日常开发中绕不开的一环,Java 8之前使用Date API,Java 8之后推荐使用LocalDate API。

Java 8之前的日期操作

在Java 8之前,主要使用Date、Calendar、SimpleDateFormat来操作日期,不得不说习惯了.NET中的DateTime之后,再用这套API来操作日期,就一个评价:“烂”的“遥遥领先”。
Date
Java中表示日期和时间的类,一般用于获取当前的日期和时间。

  • new Date():表示的就是当前日期。
  • toString():当前日期按文本格式输出,格式类似于这样:Wed Apr 03 09:59:51 CST 2024
  • after():日期比较,还有一个before()函数,用于判断日期在当前日期之前还是之后。
  • getYear():你认为他返回的是年份,其实他返回的是当前年份-1900年,比如2024返回的就是124,你以为这就完了,getMonth()居然是从0开始的,也就是说现在是4月,他的返回值就是3,所以为啥Java的学习氛围比.NET的好,一个小小的日期操作,就让我学到了要知其然更要知其所以然,尤其不能想当然。
  • getTime():返回一个UNIX时间戳,即1970年1月1日以来的毫秒数。

SimpleDateFormat
很明显,toString()这种东西是无法满足日常的格式化输出需求的,这个时候我们就需要用到SimpleDateFormat,比如我们常见的格式化yyyy-MM-dd HH:mm:ss输出。

    Date date = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println(sdf.format(date));

还有常见的字符串转日期操作:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String frd = "1949-10-01 03:00:00";
    Date date = sdf.parse(frd);

Calendar
项目中也经常要用到日期计算,Date稍有些力不从心,这时就需要Calendar,来处理日期和时间的计算。

  • getInstance():Calendar是一个抽象类,不能直接实例化。
  • set():可以设置年份,月份、日期等,如calendar.set(2023,Calendar.FEBRUARY,28),当然你也可以通过calendar.set(Calendar.YEAR,2023)来单独设置。
  • add():日期的加减操作了,比如calendar.add(Calendar.DAY_OF_MONTH,1)
  • getTime():Calendar对象转Date。
  • setTime(): Date对象转Calendar。

Java 8之后的日期操作

估计也是受够了老式API,Java 8的对日期操作做了全新改进,我们可以通过java.time下的LocalDate、LocalDate、LocalDateTime、DateTimeFormatter等来处理日期和时间。
LocalDate
日期操作类,提供了各种方法来操作日期。

    LocalDate.now(); //当前日期
    LocalDate.of(1949, 10, 1); //指定日期
    LocalDate.parse("1949-10-01"); //日期转换
    LocalDate.now().getYear(); //获取年 就是当前年
    LocalDate.now().getMonthValue(); //返回月 就是当月
    LocalDate.now().getDayOfMonth(); //返回日 就是当日

LocalTime
时间操作类,不包含日期,包括小时、分钟、秒和毫秒。

    LocalTime.now(); //获取当前时间如:13:24:25.479
    LocalTime.of(13, 30, 0);//指定时间
    LocalTime.now().getHour(); //获取小时
    LocalTime.now().getMinute(); //获取分钟
    LocalTime.now().getSecond(); //获取秒

LocalDateTime
表示日期和时间,已经很接近.NET中的DateTime了,也是处理日期和时间的主要类之一。

    LocalDateTime.now(); //获取当前日期和时间
    LocalDateTime.of(1949, 10, 1, 15, 0); //创建指定日期和时间
    LocalDateTime.parse("1949-10-01T15:00:00"); //日期转换,注意这个T是必须的
    LocalDateTime.parse("1949-10-01 15:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); //固定格式转换

Duration
对标.NET中的TimeSpan。

    LocalDateTime now = LocalDateTime.now();
    LocalDateTime born = LocalDateTime.of(1949, 10, 1, 15, 0);
    Duration duration = Duration.between(born, now); //计算日期差,可以精确到纳秒
    long day = duration.toDays();
posted @ 2024-04-03 13:51  古法编程  阅读(24)  评论(0)    收藏  举报