Java时间处理(UTC时间和本地时间转换)

文章内容引用来源:

http://blog.csdn.net/top_code/article/details/50462922

前言:

本文主要对UTC、GMT、CST等时间概念做简单的介绍,比较实用的在于本文最后一个小知识点:带时区格式的时间和本地时间格式两者之间的转换方法,再次只是对简单情况做处理,如果需要处理复杂的时间转换,可以百度找一下jar包。

1 UTC(世界标准时间)

协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time”/法文“TempsUniversel Coordonné”而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。

2 GMT(格林尼治平时)

格林尼治平时(又称格林尼治平均时间或格林尼治标准时间,旧译格林威治标准时间;英语:Greenwich MeanTime,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能与实际的太阳时有误差,最大误差达16分钟。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治时间已经不再被作为标准时间使用。现在的标准时间,是由原子钟报时的协调世界时(UTC)。

3 CST(北京时间)

北京时间,China Standard Time,中国标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8。不过这个CST这个缩写比较纠结的是它可以同时代表四个不同的时间:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00

4 带时区格式的时间和本地时间两者之间的转换方法工具类

下面这个工具类是为带有时区格式的时间转换为本地时间来开发的工具类,如果方法功能不满足请自行百度,或自行添加方法。
/**
 * 时间格式转换工具类(utc时间和本地时间两者的转换)
 *
 */
public class TimeConverterUtil {

	private static Logger logger = Logger.getLogger(TimeConverterUtil.class);
	
	/**
	 * 函数功能描述:UTC时间转本地时间格式
	 * @param utcTime UTC时间
	 * @param utcTimePatten UTC时间格式
	 * @param localTimePatten	本地时间格式
	 * @return 本地时间格式的时间
	 * eg:utc2Local("2017-06-14 09:37:50.788+08:00", "yyyy-MM-dd HH:mm:ss.SSSXXX", "yyyy-MM-dd HH:mm:ss.SSS")
	 */
	public static String utc2Local(String utcTime, String utcTimePatten, String localTimePatten) {
		SimpleDateFormat utcFormater = new SimpleDateFormat(utcTimePatten);
		utcFormater.setTimeZone(TimeZone.getTimeZone("UTC"));//时区定义并进行时间获取
		Date gpsUTCDate = null;
		try {
			gpsUTCDate = utcFormater.parse(utcTime);
		} catch (ParseException e) {
			e.printStackTrace();
			return utcTime;
		}
		SimpleDateFormat localFormater = new SimpleDateFormat(localTimePatten);
		localFormater.setTimeZone(TimeZone.getDefault());
		String localTime = localFormater.format(gpsUTCDate.getTime());
		return localTime;
	}
	
	/**
	 * 函数功能描述:UTC时间转本地时间格式
	 * @param utcTime UTC时间
	 * @param localTimePattern 本地时间格式(要转换的本地时间格式)
	 * @return 本地时间格式的时间
	 */
	public static String utc2Local(String utcTime, String localTimePattern){
		String utcTimePattern = "yyyy-MM-dd";
		String subTime = utcTime.substring(10);//UTC时间格式以 yyyy-MM-dd 开头,将utc时间的前10位截取掉,之后是含有多时区时间格式信息的数据

		//处理当后缀为:+8:00时,转换为:+08:00 或 -8:00转换为-08:00
		if(subTime.indexOf("+") != -1){
			subTime = changeUtcSuffix(subTime, "+");
		}
		if(subTime.indexOf("-") != -1){
			subTime = changeUtcSuffix(subTime, "-");
		}
		utcTime = utcTime.substring(0, 10) + subTime;
				
		//依据传入函数的utc时间,得到对应的utc时间格式
		//步骤一:处理 T
		if(utcTime.indexOf("T") != -1){
			utcTimePattern = utcTimePattern + "'T'";
		}
		
		//步骤二:处理毫秒SSS
		if(utcTime.indexOf(".") != -1){
			utcTimePattern = utcTimePattern + " HH:mm:ss.SSS";
		}else{
			utcTimePattern = utcTimePattern + " HH:mm:ss";
		}
		
		//步骤三:处理时区问题
		if(subTime.indexOf("+") != -1 || subTime.indexOf("-") != -1){
			utcTimePattern = utcTimePattern + "XXX";
		}
		else if(subTime.indexOf("Z") != -1){
			utcTimePattern = utcTimePattern + "'Z'";
		}
		
		if("yyyy-MM-dd HH:mm:ss".equals(utcTimePattern) || "yyyy-MM-dd HH:mm:ss.SSS".equals(utcTimePattern)){
			return utcTime;
		}
		
		SimpleDateFormat utcFormater = new SimpleDateFormat(utcTimePattern);
		utcFormater.setTimeZone(TimeZone.getTimeZone("UTC"));
		Date gpsUtcDate = null;
		try {
			gpsUtcDate = utcFormater.parse(utcTime);
		} catch (Exception e) {
			logger.error("utcTime converter localTime failed!!!", e);
			return utcTime;
		}
		SimpleDateFormat localFormater = new SimpleDateFormat(localTimePattern);
		localFormater.setTimeZone(TimeZone.getDefault());
		String localTime = localFormater.format(gpsUtcDate.getTime());
		return localTime;
	}
	
	/**
	 * 函数功能描述:修改时间格式后缀
	 * 函数使用场景:处理当后缀为:+8:00时,转换为:+08:00 或 -8:00转换为-08:00
	 * @param subTime
	 * @param sign
	 * @return
	 */
	private static String changeUtcSuffix(String subTime, String sign){
		String timeSuffix = null;
		String[] splitTimeArrayOne = subTime.split("\\" + sign);
		String[] splitTimeArrayTwo = splitTimeArrayOne[1].split(":");
		if(splitTimeArrayTwo[0].length() < 2){
			timeSuffix = "+" + "0" + splitTimeArrayTwo[0] + ":" + splitTimeArrayTwo[1];
			subTime = splitTimeArrayOne[0] + timeSuffix;
			return subTime;
		}
		return subTime;
	}
	
	/**
	 * 函数功能描述:获取本地时区的表示(比如:第八区-->+08:00)
	 * @return
	 */
	public static String getTimeZoneByNumExpress(){
		Calendar cal = Calendar.getInstance();
		TimeZone timeZone = cal.getTimeZone();
		int rawOffset = timeZone.getRawOffset();
		int timeZoneByNumExpress = rawOffset/3600/1000;
		String timeZoneByNumExpressStr = "";
		if(timeZoneByNumExpress > 0 && timeZoneByNumExpress < 10){
			timeZoneByNumExpressStr = "+" + "0" + timeZoneByNumExpress + ":" + "00";
		}
		else if(timeZoneByNumExpress >= 10){
			timeZoneByNumExpressStr = "+" + timeZoneByNumExpress + ":" + "00";
		}
		else if(timeZoneByNumExpress > -10 && timeZoneByNumExpress < 0){
			timeZoneByNumExpress = Math.abs(timeZoneByNumExpress);
			timeZoneByNumExpressStr = "-" + "0" + timeZoneByNumExpress + ":" + "00";
		}else if(timeZoneByNumExpress <= -10){
			timeZoneByNumExpress = Math.abs(timeZoneByNumExpress);
			timeZoneByNumExpressStr = "-" + timeZoneByNumExpress + ":" + "00";
		}else{
			timeZoneByNumExpressStr = "Z";
		}
		return timeZoneByNumExpressStr;
	} 
	
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页