带时区时间和本地时间相互转化
本文主要简单提供了一个本地时间和带时区的时间的互换。由于客户端和服务端可能是在不同的地区的,因此建议客户端和服务端之间传输时间采用ISO时间,ISO时间是一个绝对时间,也就是全世界都是以这个标准来算各自地区的本地时间的。
本地时间和ISO时间
本地时间格式:
yyyy-MM-dd HH:mm:ss
2019-01-01 12:02:03
ISO时间格式:
yyyy-MM-dd’T’HH:mm:ss.SSSXXX
2019-01-01T12:02:03.000+08:00
代码如下:
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
package com.ydwl.iras.util;
import org.springframework.util.StringUtils;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
/**
* 时间转换工具类
*/
public class DateTimeUtil {
public static final String TIME_FORMAT_ISO = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
public static final String TIME_FORMAT_DEFAULT = "yyyy-MM-dd HH:mm:ss";
public static final String TIME_FORMAT_SIMPLE_T = "yyyy-MM-ddTHH:mm:ss";
/**
* 本地时间字符串(2018-09-01 00:00:00)转ISO时间字符串(2018-09-01T00:00:00.000+08:00)
* @author : xxx
* @date : 2019/9/1 23:16
* @param time :
* @return : java.lang.String
* @since 1.0.0
*/
public static String convertLocalToIso(@NotNull String time){
ZonedDateTime zonedDateTime = getZoneDateTime(time);
DateTimeFormatter isoFormatter = getFormatter(DateTimeUtil.TIME_FORMAT_ISO);
return zonedDateTime.format(isoFormatter).toString();
}
/**
* ISO时间字符串(2018-09-01T00:00:00.000+08:00)转 本地时间字符串(2018-09-01 00:00:00)
* @author : xxx
* @date : 2019/9/1 23:19
* @param time :
* @return : java.lang.String
* @since 1.0.0
*/
public static String convertIsoToLocal(@NotNull String time){
LocalDateTime localDateTime = getZoneDateTime(time, DateTimeUtil.TIME_FORMAT_ISO).toLocalDateTime();
return localDateTime.format(getFormatter(DateTimeUtil.TIME_FORMAT_DEFAULT));
}
/**
* 将yyyy-MM-dd HH:mm:ss时间字符串转换为带时区时间
* @author : xxx
* @date : 2019/9/1 22:38
* @param time :
* @return : java.time.ZonedDateTime
* @since 1.0.0
*/
public static ZonedDateTime getZoneDateTime(@NotNull String time){
return getZoneDateTime(time,null);
}
/**
* 将时间字符串转换为带时区时间
* @author : xxx
* @date : 2019/9/1 22:38
* @param time :
* @param pattern : 为空时默认为 yyyy-MM-dd HH:mm:ss
* @return : java.time.ZonedDateTime
* @since 1.0.0
*/
public static ZonedDateTime getZoneDateTime(@NotNull String time, String pattern){
return LocalDateTime.parse(time,getFormatter(pattern)).atZone(ZoneId.systemDefault());
}
/**
* 返回指定格式的时间格式器
* @author : xxx
* @date : 2019/9/1 22:31
* @param pattern : 为空时返回 默认的 “yyyy-MM-dd HH:mm:ss”格式
* @return : java.time.format.DateTimeFormatter
* @since 1.0.0
*/
private static DateTimeFormatter getFormatter(String pattern){
return FormatterTypeEnum.getFormatterByPattern(pattern);
}
/**
* 时间格式枚举类
*/
public enum FormatterTypeEnum{
FORMATTER_ISO(DateTimeUtil.TIME_FORMAT_ISO,DateTimeFormatter.ofPattern(DateTimeUtil.TIME_FORMAT_ISO)),
FORMATTER_DEFAULT(DateTimeUtil.TIME_FORMAT_DEFAULT,DateTimeFormatter.ofPattern(DateTimeUtil.TIME_FORMAT_DEFAULT)),
FORMATTER_SIMPLE_T(DateTimeUtil.TIME_FORMAT_SIMPLE_T,DateTimeFormatter.ofPattern(DateTimeUtil.TIME_FORMAT_SIMPLE_T)),
;
private String pattern;
private DateTimeFormatter formatter;
FormatterTypeEnum(String pattern, DateTimeFormatter formatter){
this.pattern = pattern;
this.formatter = formatter;
}
/**
* 不存在创建,为空返回默认的
* @author : xxx
* @date : 2019/9/1 22:58
* @param pattern :
* @return : java.time.format.DateTimeFormatter
* @since 1.0.0
*/
public static DateTimeFormatter getFormatterByPattern(String pattern){
if (StringUtils.isEmpty(pattern)){
return FORMATTER_DEFAULT.getFormatter();
}
for (FormatterTypeEnum typeEnum : FormatterTypeEnum.values()){
if (typeEnum.getPattern().equals(pattern)){
return typeEnum.getFormatter();
}
}
return DateTimeFormatter.ofPattern(pattern);
}
public String getPattern() {
return pattern;
}
public DateTimeFormatter getFormatter() {
return formatter;
}
}
public static void main(String[] args) {
String s = convertLocalToIso("2018-01-09 09:00:09");
String s1 = convertIsoToLocal(s);
}
}