Java8 DateTimeFormatter常见问题分析总结

时间:2025-03-17 20:52:37

紧接着上篇文章Random和SimpleDateFormat的坑和最佳实践

为什么是线程安全的?

还是看源代码和注释说

* This class is immutable and thread-safe.
 *
 * @since 1.8
 */
public final class DateTimeFormatter {}

很明显,通过final关键字,做成了不可变类,类似String,不仅线程安全而且高效。

进行格式化的方法ofPattern()一直适用吗?

通常使用来说,我们可以通过

DateTimeFormatter formatter = ("yyyy-MM-dd HH:mm");

or

DateTimeFormatter formatter = ("E, yyyy-MMMM-dd HH:mm", );

or

DateTimeFormatter formatterTime = ("yyyy-MM-dd HH:mm:ss").withZone(("+8"));

以上,都是OK的,而且也是最长被用到的,但是不会一直正确,如下:

DateTimeFormatter DATE_TIME_FORMATTER = ("yyyyMMddHHmmssS");
LocalDateTime dt1 = ("20190510134643946", DATE_TIME_FORMATTER);
(dt1);

异常如下:

Exception in thread "main" : Text '20190510134643946' could not be parsed at index 0
    at .parseResolved0(:1949)
    at (:1851)
    at (:492)
    at .test28(:71)
    at (:65)
那么该怎么做呢?

DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
                // 解析date+time
                .appendPattern("yyyyMMddHHmmss")
                // 解析毫秒数
                .appendValue(ChronoField.MILLI_OF_SECOND, 3)
                .toFormatter();

DateTimeFormatter中的常用转换

1. LocalDateTime 转化为Date

//将 转换为java8 的,默认时区为东8区
    public static LocalDateTime dateConvertToLocalDateTime(Date date) {
        return ().atOffset(("+8")).toLocalDateTime();
    }
 
   
    //将java8 的  转换为 ,默认时区为东8区
    public static Date localDateTimeConvertToDate(LocalDateTime localDateTime) {
        return ((("+8")));
    }

2.  LocalDateTime转秒级时间戳、转毫秒时间戳(此处容易入坑)

String updateTime = "2019-07-28 14:11:15";
DateTimeFormatter formatterTime = ("yyyy-MM-dd HH:mm:ss").withZone(("+8"));
LocalDateTime lastLDT = (updateTime, formatterTime);
//获取秒级
long last = (("+8"));
//获取毫秒级
long last = (("+8")).toEpochMilli();

3. LocalDateTime转换String

//时间转字符串格式化
 DateTimeFormatter formatter = ("yyyyMMddHHmmssSSS");
 String dateTime = (("+8")).format(formatter);
 
//字符串转时间
String dateTimeStr = "2018-07-28 14:11:15";
DateTimeFormatter df = ("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = (dateTimeStr, df);

4. 获取当前的秒级和毫秒级时间戳

//获取秒数
Long second = ().toEpochSecond(("+8"));
//获取毫秒数
Long milliSecond = ().toInstant(("+8")).toEpochMilli();
 

总结,可以使用Instant代替 Date,LocalDateTime代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat。

Reference:

/u014044812/article/details/79231738

/p/b212afa16f1f