使用LocalDateTime进行字符串与时间戳的互相转换

时间戳 -> 字符串的三种方式

//第一种:
public static String longToStr(Long timeStamp, String pattern){
   return new SimpleDateFormat(pattern).format(timeStamp);
}

// 第二种:
public static String longToStr(Long timeStamp, String pattern){
    LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timeStamp), ZoneOffset.ofHours(8));
    return DateTimeFormatter.ofPattern(pattern).format(localDateTime);
}

// 第三种:
// 定义静态常量
public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

public static String longToStr(Long timeStamp){
    LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(timeStamp/1000L, 0, ZoneOffset.ofHours(8));
    return YYYY_MM_DD_HH_MM_SS_FORMATTER.format(localDateTime);
}
  • 性能方面:3 > 2 > 1
  • 灵活性方面(可自定义pattern):2 = 1 > 3
  • 根据需求使用,如果转换pattern基本固定,推荐使用3, 如果有传入pattern的需要,推荐使用2,任何情况下,不推荐使用1。

字符串 -> 时间戳

// 第一种:
// 定义静态常量:
public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

public static long strToLong(String timeStr){
    TemporalAccessor parse = FORMATTER.parse(timeStr);
    return LocalDateTime.from(parse).toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
}

// 第二种:
/**
 * 字符串转时间戳
 * 使用传参样例,patternType传什么值,取决于pattern是否带有时间,patternType传错会报错:
 * strToLong("2022-06-10 09:00:00", "yyyy-MM-dd HH:mm:ss", 1)
 * strToLong("2022-06-10", "yyyy-MM-dd", 2)
 *
 * @param time 时间字符串
 * @param pattern 转换格式
 * @param patternType 转换类型,1代表pattern包含日期+时间,2代表pattern仅包含日期
 * @return
 */
public static long strToLong(String time, String pattern, Integer patternType){
    TemporalAccessor parse = DateTimeFormatter.ofPattern(pattern).parse(time);
    switch (patternType) {
        case 1:
           return LocalDateTime.from(parse).toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
        case 2:
            return LocalDate.from(parse).atStartOfDay(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
        default:
            return 0;
    }
}

基本概念

  • ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则
  • Instant: 用来表示时间线上的一个点(瞬时)
  • LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的
  • LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的
  • LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的

更多api参考:LocalDateTime用法


版权声明:本文为qq_43050847原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。