java带时区时间和本地时间相互转化

带时区时间和本地时间相互转化

本文主要简单提供了一个本地时间和带时区的时间的互换。由于客户端和服务端可能是在不同的地区的,因此建议客户端和服务端之间传输时间采用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);
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值