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();

浙公网安备 33010602011771号