Epoch_time_convertion_issue
我的服务器正在使用GMT时区,但我的应用程序正在处理IST,所以我在保存到数据库时将GMT转换为IST。但是,当我将保存的IST转换为epoch time时,它将在保存的IST时间中添加5小时30分钟。
你知道为什么吗?我做错什么了吗?
将GMT转换为IST的代码:
1 2 3 4 5 6 7 8 | 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)转换为epoch time的代码。我在此方法中传递的日期是2018-01-24 15:51:01,因此此方法应返回此日期的epoch time,但在此时间中添加5小时30分钟。
1 2 3 4 | public static long getEpochDateTime(Date date) { long epochDateTime = date.getTime(); return epochDateTime; } |
DR
使用智能对象,而不是哑字符串。
1 | Instant.now().toEpochMilli() |
或:
1 | myDate.toInstant().toEpochMilli() |
细节
正如已经讨论过多次的那样,堆栈溢出…
My server is using GMT time zone
永远不要依赖时区的服务器操作系统设置。始终指定传递给java.time类方法的可选时区参数。
converting GMT to IST while saving to database
你的大部分工作都是在UTC完成的。只有在业务逻辑如此指示或向用户展示时,才调整到另一个时区。
DateFormat converter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");
使用日期时间对象而不仅仅是字符串。
不要使用麻烦的
切勿使用3-4字符的伪时区代码,如
1 | ZoneId z = ZoneId.of("Asia/Kolkata" ) ; |
以UTC格式获取当前时刻。
1 | Instant instant = Instant.now() ; |
如果代码必须与
1 | Instant instant = myJavaUtilDate.toInstant() ; |
通过调用
1 |
调整到另一个时区。同一时刻,同一时间点,不同的挂钟时间。
1 | ZonedDateTime zdt = Instant.atZone( z ) ; // Same moment, different wall-clock time. |
调用
1 |
要以其他格式生成字符串,请参见
通过提取
1 | Instant instant = zdt.toInstant() ; |
returns the epoch time
把时间作为历元的计数来跟踪是不好的做法。但是如果你坚持,你可以从1970年的第一个时刻提取毫秒数。当心数据丢失,因为
1 | long millis = instant.toEpochMilli() ; |
再拿一个
1 | Instant instant = Instant.ofEpochMilli( millis ) ; |
关于JavaTimes
JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如
现在处于维护模式的joda time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。
在哪里获取java.time类?
- Java SE 8、Java SE 9及以后
- 内置的。
- 标准JAVA API的一部分与捆绑实现。
- Java 9添加了一些小的特性和修复。
- Java SE 6和Java SE 7
- 大部分JavaTimeActudio都被移植到TealEnter后端的Java 6和7中。
- 安卓
- java.time类的Android包实现的更高版本。
- 对于早期的android,threetenabp项目适应threeten backport(如上所述)。看看如何使用三连珠……
threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如
在序列化日期时,您可能应该包括时区。新建simpledateformat("yyyy-mm-dd't'hh:mm:ss'z'");