Java SimpleDateFormat时间解析时区问题

spark JOB在hive入库的时候发生了很诡异的现象,根据report_time时间转换为小时分区的时候,时间对不上,而且只是部分时间对不上,相差12个小时。

由于其他集群未出现此问题,想通过代码发现是否逻辑存在问题。看了代码之后发现逻辑也十分简单:

获取了report_time之后直接通过一个时间转换函数,获取了时间。继续查看事件转化函数:

这里用到了java 中SimpleDateFormat 对给定的时间进行了转换,这种转换java中比较常见,应该也是没问题的。

怀疑跟集群的时间配置有关,查看集群的两台机器的时间配置:

主机节点时间配置:(NTP时间同步未打开)

另一个节点的时间配置信息就很不一致了,发现配置的是纽约时区:

怀疑是正常的代码,在不正常的时间配置中执行出现了问题,写了一个测试代码:

时区正常的机器上运行,结果正常:

另一时区设置不正常的节点运行,问题重现了:

到此,应该是确定了SimpleDateFormat跟系统时区有关了。

查询了相关资料,可以通过对SimpleDateFormat对象调用setTimeZone(TimeZone.getTimeZone("CST")方法指定时区,解决相关问题。但是更重要的是保证集群节点时间的一致性。

原文地址:https://www.cnblogs.com/lihao7/p/9115936.html

时间: 2024-11-05 19:42:11

Java SimpleDateFormat时间解析时区问题的相关文章

Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。

通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneId. ZonedDateTime是用来处理时区相关的时间,它的各种计算都离不开ZoneId.先看ZoneId. 1. ZoneId 为时区ID,比如Europe/Paris,表示欧洲巴黎时区 1.1 时区相关知识,时区,UTC时间,GMT时间,Unix时间戳 时区 地球自西向东旋转,东边比西边先看到

全面解析Java日期时间API

时区 GMT(Greenwich Mean Time):格林尼治时间,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间. UTC(Universal Time Coordinated):统一协调时间,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间,标准 UTC 时间格式 yyyy-MM-dd'T'HH:mm:ss.SSSXXX. 格林尼治时间已经不再被作为标准时间使用,UTC 是最主要的世界时间标准. Java提供了获取当前时间的方法 Syst

Java时间处理相对时间 之 时区相关

Java时间处理相对时间 之 时区相关: 在一些场景下需要取得一个相对时间值,比如取1994年1月1号到当前时间的值,这个值是一个相对值,即:不管在哪个时区,如果是同一个时间获取的值是一样的: 在Java的代码处理上需要注意一下,这里提供一个方法: 1. 思路就是将需要换算的时间转换为同一个时区来进行计算: /** * 获取当前时间,相对1994的秒数 * @return int */ public static int getSecondFrom1994() { int seconds = 0

Java日期时间API系列20-----Jdk8中java.time包中的新的日期时间API类,ZoneId时区ID大全等。

Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等.中已经对ZoneId说明,并列出了常用时区ID信息. 并且通过 java.time.ZoneId.getAvailableZoneIds()获取到所有可用时区ID. 1.测试代码 /** * 获取可用时区ID */ @Test public void getAvailableZon

Java 8 时间日期库的20个使用示例

java 8是如何处理时间及日期的 有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它.在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库.简言之,只有任务本身才会真正促使你去探索及学习.java 8的新的日期及时间API也是一样.为了学习Java 8的这个新库,这里我创建了20个以任务为导向的例子.我们先从一个简单的任务开始,比如说如何用Java 8的时间日期库来表示今天,接着再进一步生成一个带时间及时区的完整日期,然后再研究下如何完成一些更

Java 日期时间处理

Java 日期时间处理 Date java.util.Date对象表示一个精确到毫秒的瞬间; 但由于Date从JDK1.0起就开始存在了,历史悠久,而且功能强大(既包含日期,也包含时间),所以他的大部分构造器/方法都已Deprecated,因此就不再推荐使用(如果贸然使用的话,可能会出现性能/安全方面的问题);下面我仅介绍它还剩下的为数不多的几个方法(这些方法的共同点是Date与毫秒值的转换): 构造器 Date(): 在底层调用System.currentTimeMillis()作为日期参数.

Java 日期时间

java.util 包提供了 Date 类来封装当前的日期和时间. Date 类提供两个构造函数来实例化 Date 对象. 第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数. Date(long millisec) Date对象创建以后,可以调用下面的方法. 序号 方法和描述 1 boolean after(Date date)若当调用此方法的Date对象在指定日期之后返回true,否则返回false. 2 boo

Java 8时间和日期API 20例

伴随lambda表达式.streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API.Java处理日期.日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限.Java也意识到需要一个更好的 API来满足社区中已经习惯了使用JodaTime API的人们.全新API的众多好处之一就是,明确了日期时间概念,例如:瞬时(instant). 长

Java 8 时间日期库的20个使用演示样例

除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务演示样例来学习怎样使用Java 8的这套API.Java对日期,日历及时间的处理一直以来都饱受诟病.尤其是它决定将java.util.Date定义为可改动的以及将SimpleDateFormat实现成非线程安全的. 看来Java已经意识到须要为时间及日期功能提供更好的支持了,这对已经习惯使用Joda时间日期库的社区而言也是件好事. 关于这个新的时间日期库的最