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

2023-11-12

文章内容引用来源:

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;
	} 
	
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java时间处理(UTC时间和本地时间转换) 的相关文章

  • 如何在 JPA 中使用枚举

    我有一个电影租赁系统的现有数据库 每部电影都有一个评级属性 在 SQL 中 他们使用约束来限制该属性的允许值 CONSTRAINT film rating check CHECK rating text text OR rating tex
  • 如何将 .cer 证书导入 java 密钥库?

    在开发 Java Web 服务客户端期间 我遇到了一个问题 Web 服务的身份验证使用客户端证书 用户名和密码 我从网络服务背后的公司收到的客户端证书位于 cer格式 当我使用文本编辑器检查该文件时 它具有以下内容 BEGIN CERTIF
  • 警告:跳过条目,因为它不是绝对 URI。 NetBeans 中的 GlassFish

    我成功安装了 GlassFish 但是 当我启动服务器时 我收到两条警告消息 警告 跳过条目 因为它不是绝对 URI 那是关于什么的 Launching GlassFish on Felix platform Aug 09 2014 10
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java 9 中可以使用提前编译吗?

    As per JEP 295 http openjdk java net jeps 295 任何 JDK 模块 类或用户代码的 AOT 编译都是实验性的 JDK 9 中不支持 要使用 AOT 化的 java base 模块 用户必须编译该模
  • ASM之前看一下maxStack指令吗?

    我正在尝试使用 ASM 库将字节代码转换为不同的格式 这可以使用 MethodVisitor 来完成 就像这个简单的测试代码一样 return new MethodVisitor ASM7 Override public void visi
  • Ant 无法启动,给出主类错误

    我正在运行 Elementary OS 基于 Ubuntu 12 并且在运行 apache ant 时遇到问题 它在重新启动之前就可以正常工作 所以我不确定会发生什么变化 我在 etc environment 中定义了环境变量 如下所示 P
  • 使用 CrudRepository 进行自定义查询

    我想使用 CrudRepository 自定义查询 这是我的代码 Repository public interface CustomerRepository extends CrudRepository
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • Java 7 中 Object 和 int 的比较

    最近我偶然发现了一个问题 让我停下来思考 对我来说 下面的代码应该总是会触发错误 但是当我的一位同事问我为什么 Eclipse 没有显示错误时 我无法回答任何问题 class A public static void main String
  • java.lang.IllegalArgumentException:addChild:子名称“/”不唯一

    java lang IllegalArgumentException addChild 子名称 不唯一 通过在 tomcat webapps 文件夹中启用和禁用 saml 单点登录来替换现有 war 文件时遇到此问题 我正在使用 apach
  • Java中无参数的for循环

    我在看别人的代码 发现了这段代码 for 我不是 Java 专家 这行代码在做什么 起初 我认为这会创建一个无限循环 但在该程序员使用的同一个类中 while true 其中 如果我错了 请纠正我 是一个无限循环 这两个相同吗 为什么有人会
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • 在Spring-Boot中,我们如何在同一个项目中连接两个数据库(Mysql数据库和MongoDB)?

    我正在尝试创建一个 Spring Boot 项目 其中我有一个要求 我想连接到不同的数据库 MySql 和 MongoDB 我是否需要做一些特殊的事情来连接到这两个数据库 或者 spring boot 会自动计算出自己连接到这两个数据库 我
  • java Runtime.getRunTime().exec 和通配符?

    我正在尝试使用删除垃圾文件 Process p Runtime getRuntime exec 只要我不使用通配符 它 就可以正常工作 即 Process p Runtime getRuntime exec bin rm f specifi
  • java 1.8下无法启动eclipse

    java 1 8 升级后我无法启动 eclipse 附上错误截图 这是我的 eclipse 配置设置 我该如何解决 startup plugins org eclipse equinox launcher 1 3 0 v20120522 1
  • Java .split("|") 不工作

    我刚刚遇到了一个问题分割法 http docs oracle com javase 6 docs api java lang String html split 28java lang String 29for 字符串不适用于字符 作为一个
  • 如何使用 Nimbus LookAndFeel 更改 JToolTip 的背景颜色?

    在使用 Nimbus LookAndFeel 的基于 Swing 的 Java 应用程序中 我尝试设置工具提示的背景颜色 因此 我创建了 JToolTip 的子类 并通过重写 createToolTip 在我的组件中使用它 到目前为止一切正
  • Drools:为什么是无状态会话?

    Drools 使用会话来存储运行时数据 为此 有两种会话 无状态和有状态 与无状态会话相比 有状态会话允许迭代调用 并且似乎比无状态会话具有所有优势 那么为什么会有无状态会话呢 他们服务的目的是什么 与有状态会话相比 它们的优势是什么 谢谢
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐

  • 电脑分盘怎么分?分盘详细教程来了,图文教学

    电脑作为小伙伴日常生活使用的工具 很多事情都需要使用电脑来进行处理 虽然小伙伴使用电脑比较多 但是还是有不少的小伙伴不知道电脑分盘怎么分 其实电脑分盘很简单 下面小编就以图文教学的方式 详细的向小伙伴介绍电脑分盘教程 电脑分盘怎么分 很多小
  • 复化中矩形matlab函数法,MATLAB–Mupad 初学者(四)~(八)

    四 函数的创建 一 用赋值运算符创建函数 y 2 x 1 二 用映射创建函数 格式 f x gt body 简化函数后再创建函数 f x gt body直接创建函数 f x gt x 2 1 注意有无等号的区别 三 创建分段函数 1 pie
  • 计算机组成原理(2)-软件设计(二十三)

    计算机组成原理 1 软件设计 二十二 https blog csdn net ke1ying article details 129372288 一 层次化存储结构 速度由慢到快 外存 辅存 硬盘 光盘 U盘 gt 内存 主存 gt cac
  • 【无标题】如何实现权限过滤

    springboot mybatis plus关于数据权限过滤应该怎么实现 spring boot java 角色和部门关联 每个角色可以设置一个数据范围 1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数
  • PaxosStore解读

    PaxosStore解读 1 QuorumKV NWR 微信有大量分布式存储 QuorumKV 使用这个算法保证一致性 我们对这个算法做了改进 创造性地把数据副本分离出版本编号和数据存到不同设备 其中N 3 数据只有2份 版本编号有3份 在
  • Qt/C++开发经验小技巧281-285

    悬停窗体QDockWidget默认在标题栏右键会弹出悬停模块的显示隐藏菜单 如果需要去掉 会发现设置Qt NoContextMenu或者事件过滤器拦截都是无效的 必须设置 dockWidget gt setContextMenuPolicy
  • adb logcat命令查看并过滤android输出log

    http blog csdn net hansel article details 38088583 cmd命令行中使用adb logcat命令查看Android系统和应用的log dos窗口按ctrl c中断输出log记录 logcat日
  • 小米路由器3潘多拉固件刷机教程

    小米路由器的官方固件优化不够好 很多人都出现限速 断流的现象 我之前也出现过限速的情况 最后没办法只能设置路由器定时重启 前几天突发奇想把定时重启关了 发现路由器居然连着好几天都没啥问题 我以为从此以后就能安心用了 可惜今天又出现了无法上网
  • Flutter Firebase身份验证教程

    在Flutter Firebase身份验证的这篇文章中 我们将了解如何使用Firebase的flutter插件向我们的Firebase应用程序验证用户身份 如果您不熟悉颤动 建议您先阅读此内容 然后再继续 它将为您提供有关抖动的基本概念 并
  • html 调高德地图 导航,地图控件-参考手册-地图 JS API

    在线插件是在基础地图服务上增加的额外功能 您可以根据自己的需要选择添加 插件分为两类 一类是地图控件 它们是用户与地图交互的UI元素 例如缩放控制条 ToolBar 等 一类是功能型插件 用来完成某些特定地图功能 比如鼠标工具 MouseT
  • Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数

    Java多线程读取图片内容并返回 1 ExecutorService线程池 2 效率截图 3 源码 1 ExecutorService线程池 ExecutorService线程池 并可根据系统核数动态确定线程池最大数 最大 最小线程数一致
  • vue打包上线如此简单

    大家好 我是大帅子 最近好多人私信我 要我出一期vue的打包上线的文章 那么今天他来了 废话不多说 我们直接开始吧 我们顺便给大家提一下vue项目中的优化 项目打包 1 打开终端 直接在终端输入 我把npm 跟 yarn的打包命令都放在这里
  • CMake增加版本号

    为工程设置版本号 当然可以在源文件中增加版本号变量 但也可以使用CMakeLists txt设置可变的版本号 提供更多的便利性 1 修改CMakeLists txt 用set命令设置版本号 设置最大版本号和最小版本号 set Calcula
  • python 历史版本下载大全

    历史版本下载地址 https www python org ftp python
  • java 对接OmniLayer钱包

    上代码 如果帮助到了你 请点点关注 谢谢 Data public class BtcApi Logger logger Logger getLogger BtcApi class private String rpcUrl private
  • 详解八大排序算法-附动图和源码(插入,希尔,选择,堆排序,冒泡,快速,归并,计数)

    目录 一 排序的概念及应用 1 排序的概念 2 排序的应用 3 常用的排序算法 二 排序算法的实现 1 插入排序 1 1直接插入排序 1 2希尔排序 缩小增量排序 2 选择排序 2 1直接选择排序 2 2堆排序 3 比较排序 3 1冒泡排序
  • Java接口幂等性设计场景解决方案v1.0

    Java接口幂等性设计场景解决方案v1 0 1 面试 实际开发场景 1 1面试场景题目 分布式服务接口的幂等性如何设计 比如不能重复扣款 1 2 题目分析 一个分布式系统中的某个接口 要保证幂等性 如何保证 这个事 其实是你做分布式系统的时
  • JSP session的生命周期简介说明

    转自 JSP session的生命周期简介说明 下文笔者将讲述session生命周期的相关简介说明 如下所示 Session存储在服务器端 当客户端关闭浏览器 并不意味着Session对象的销毁 如果不是显式调用invalidate 去销毁
  • [39题] 牛客深度学习专项题

    1 卷积核大小 提升卷积核 convolutional kernel 的大小会显著提升卷积神经网络的性能 这种说法是 正确的 错误的 这种说法是错误的 提升卷积核的大小并不一定会显著提升卷积神经网络的性能 卷积核的大小会影响网络的感受野 r
  • Java时间处理(UTC时间和本地时间转换)

    文章内容引用来源 http blog csdn net top code article details 50462922 前言 本文主要对UTC GMT CST等时间概念做简单的介绍 比较实用的在于本文最后一个小知识点 带时区格式的时间和