Epoch_time_conversion_issue
Posted
技术标签:
【中文标题】Epoch_time_conversion_issue【英文标题】:Epoch_time_convertion_issue 【发布时间】:2018-07-03 02:51:44 【问题描述】:我的服务器正在使用 GMT 时区,但我的应用程序正在使用 IST,所以我在保存到数据库的同时将 GMT 转换为 IST。但是当我将此保存的 IST 转换为纪元时间时,它会增加 5 小时 30 分钟到节省了 IST 时间。
你知道为什么吗?我做错什么了吗?
GMT转IST代码:
public static Date convertGmtToIst(Date date) throws ParseException
DateFormat converter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");
converter.setTimeZone(TimeZone.getTimeZone("IST"));
String dateReturns = converter.format(date);
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");
Date alteredDate = formatter.parse(dateReturns);
return alteredDate;
这是我用来将 IST(2018-01-24 15:51:01) 转换为纪元时间的代码。我在此方法中传递的日期是 2018-01-24 15:51:01 所以这个方法应该返回这个日期的纪元时间,但它在这个时间上增加了 5 小时 30 分钟。
public static long getEpochDateTime(Date date)
long epochDateTime = date.getTime();
return epochDateTime;
【问题讨论】:
能否提供您用于从 GMT 转换为 IST 以及反之亦然的代码? @Prashant public static Date convertGmtToIst(Date date) throws ParseException DateFormat converter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");转换器.setTimeZone(TimeZone.getTimeZone("IST")); String dateReturns = converter.format(date); SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");日期更改日期 = formatter.parse(dateReturns);返回更改日期; 发帖前搜索 Stack Overflow。这已经被报道过很多次了。提示:java.time.Instant
.
我不明白为什么在 2018 年你还在尝试使用早已过时的 SimpleDateFormat
类和同样过时的朋友 Date
。 java.time
, the modern Java date and time API, 使用起来更好。
如果我们有机会在这种情况下为您提供帮助,您必须包括您看过的答案(至少几个示例),并准确解释它们是如何不足或失败的来解决你的问题。否则我们只能用我们的精力重复那些无用的答案中所说的话,而不是为了任何人的利益。
【参考方案1】:
tl;博士
使用智能对象,而不是哑字符串。
Instant.now().toEpochMilli()
或者:
myDate.toInstant().toEpochMilli()
详情
正如在 Stack Overflow 上多次讨论过的......
我的服务器使用的是 GMT 时区
永远不要依赖服务器操作系统的时区设置。始终指定传递给 java.time 类的方法的可选时区参数。
在保存到数据库时将 GMT 转换为 IST
您的大部分工作都使用 UTC。仅当业务逻辑要求或向用户展示时才调整到另一个时区。
日期格式转换器 = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");
使用日期时间对象,而不仅仅是字符串。
永远不要使用麻烦的Date
和Calendar
类。现在被 java.time 类所取代。
切勿使用 3-4 个字符的伪时区代码,例如 IST
。它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。使用大陆/地区格式的真实时区。
ZoneId z = ZoneId.of( “Asia/Kolkata” ) ;
以 UTC 获取当前时刻。
Instant instant = Instant.now() ;
如果您的代码必须与 Date
互操作,请在旧类上使用新方法来回转换。
Instant instant = myJavaUtilDate.toInstant() ;
通过调用toString
,以标准 ISO 8601 格式生成一个字符串来表示这一刻。
String output = instant.toString() ;
调整到另一个时区。同一时刻,时间轴上的同一点,不同的挂钟时间。
ZonedDateTime zdt = Instant.atZone( z ) ; // Same moment, different wall-clock time.
调用toString
生成一个字符串,该字符串的格式通过将时区名称附加在方括号中,巧妙地扩展了 ISO 8601 格式。
String output = zdt.toString() ;
要生成其他格式的字符串,请参阅DateTimeFormatter
类。
您可以通过提取Instant
从分区时刻移动到 UTC。
Instant instant = zdt.toInstant() ;
返回纪元时间
将跟踪时间作为从 epoch 开始计数是不好的做法。但是,如果您坚持,您可以从 UTC 的 1970 年第一刻开始提取毫秒数。小心数据丢失,Instant
的分辨率为纳秒级。
long millis = instant.toEpochMilli() ;
再次获取Instant
。同样,我建议反对使用从时代开始计数,但如果你坚持的话。
Instant instant = Instant.ofEpochMilli( millis ) ;
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
Java SE 8、Java SE 9 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6 和 Java SE 7 ThreeTen-Backport 中的大部分 java.time 功能都向后移植到 Java 6 和 7。 Android java.time 类的 android 捆绑包实现的更高版本。 对于早期的 Android,ThreeTenABP 项目采用 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…。ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和more。
【讨论】:
【参考方案2】:您可能应该在序列化日期时包含时区。 new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
【讨论】:
以上是关于Epoch_time_conversion_issue的主要内容,如果未能解决你的问题,请参考以下文章