前言
由于历史原因,项目上使用Date、LocalDateTime、时间戳甚至日期字符串的情况五花八门,在每次参数传递的时候,遇到类型不一致的时候就会很痛苦,接下来就总结下这些类之间到底怎样互转。
1 From Date
Date作为老牌的日期处理类,用到它的地方一定很多,首先针对Date做下总结:
1.1 dateToString
// 经典的SimpleDateFormat,注意SimpleDateFormat是非线程安全的,所以每次使用都要new一个对象
public static String dateToString(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}
1.2 dateToTimestamp
// Date转毫秒时间戳
public static long dateToMilliSeconds(Date date) {
return date.getTime();
}
// Date转秒时间戳
public static long dateToSeconds(Date date) {
return date.getTime() / 1000;
}
// Date转纳秒时间戳, 由于Date只精确到毫秒级,所以直接乘以6个0即可
public static long dateToNanos(Date date) {
return date.getTime() * 1000 * 1000;
}
1.3 dateToLocalDateTime
public static LocalDateTime dateToLocalDateTime(Date date) {
long milliSeconds = date.getTime();
Instant instant = Instant.ofEpochMilli(milliSeconds);
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}
2 From LocalDateTime
2.1 localDateTimeToString
public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String localDateTimeToString(LocalDateTime localDateTime) {
return dateTimeFormatter.format(localDateTime);
}
2.2 localDateTimeToTimestamp
public static ZoneId zoneId = ZoneId.systemDefault();
// 转毫秒时间戳
public static long localDateTimeToMilliSeconds(LocalDateTime localDateTime) {
return localDateTime.atZone(zoneId).toInstant().toEpochMilli();
}
// 转秒时间戳
public static long localDateTimeToSeconds(LocalDateTime localDateTime) {
return localDateTime.atZone(zoneId).toEpochSecond();
}
// 转"秒.纳秒"时间戳
public static String localDateTimeToNanos(LocalDateTime localDateTime) {
ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
return String.format("%d.%d", zonedDateTime.toEpochSecond(), zonedDateTime.getNano()));
2.3 LocalDateTimeToDate
public static LocalDateTime localDateTimeToDate(LocalDateTime localDateTime) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
Instant instant = zonedDateTime.toInstant();
long milliSeconds = instant.toEpochMilli();
return new Date(milliSeconds);
}
3 From 时间戳
3.1 TimestampToDate
// 毫秒转Date
public static Date milliSecondsToDate(Long milliSenonds) {
return new Date(milliSenonds);
}
// 秒转Date
public static long secondsToDate(Long seconds) {
return new Date(seconds * 1000);
}
3.2 TimestampToLocalDateTime
public static ZoneId zoneId = ZoneId.systemDefault();
// 毫秒转LocalDateTime
public static LocalDateTime milliSecondsToLocalDateTime(Long milliSenonds) {
Instant instant = Instant.ofEpochMilli(milliSeconds);
return LocalDateTime.ofInstant(instant, zoneId);
}
// 秒转LocalDateTime
public static LocalDateTime secondsToLocalDateTime(Long seconds) {
Instant instant = Instant.ofEpochSecond(milliSeconds);
return LocalDateTime.ofInstant(instant, zoneId);
}
3.2 TimestampToString
public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static ZoneId zoneId = ZoneId.systemDefault();
// 毫秒转String
public static String milliSecondsToString(Long milliSenonds) {
return dateTimeFormatter.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(milliSenonds), zoneId));
}
// 秒转String
public static long secondsToString(Long seconds) {
return dateTimeFormatter.format(LocalDateTime.ofInstant(Instant.ofEpochSecond(milliSenonds), zoneId));
}
4 From 日期字符串
4.1 StringToDate
public static Date StringToDate(String dateString) {
try {
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateString);
} catch (ParseException e) {
return null;
}
}
4.2 StringToLocalDateTime
public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static LocalDateTimeStringToLocalDateTime(String dateTimeString) {
TemporalAccessor temporalAccessor = dateTimeFormatter.parse(dateTimeString);
return LocalDateTime.from(temporalAccessor);
}
4.3 StringToTimestamp
public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static ZoneId zoneId = ZoneId.systemDefault();
// 转秒
public static Long StringToSeconds(String dateString) {
return LocalDateTime.from(dateTimeFormatter.parse(dateTimeString)).atZone(zoneId).toEpochSecond();
}
// 转毫秒
public static Long StringToMilliSeconds(String dateString) {
return LocalDateTime.from(dateTimeFormatter.parse(dateTimeString)).atZone(zoneId).toInstant().toEpochMilli();
}
// 转”秒.纳秒“
public static Long StringToNanoSeconds(String dateString) {
ZonedDateTime zonedDateTime = LocalDateTime.from(dateTimeFormatter.parse(dateTimeString)).atZone(zoneId);
return String.format("%d.%d", zonedDateTime.toEpochSecond(), zonedDateTime.getNano()));
}