Pra*_*ind 5 java timezone datetime timezone-offset java-time
ZonedDateTime我正在使用 JDK 8,并且Timestamp经常使用它。但我仍然无法解决我面临的问题。
假设我得到了TimestampGMT (UTC) 格式的文件,并且我的服务器位于某处。假设它设置为Asia/CalcuttaTimeZone (其 ZoneOffset 为+05:30)。
基本上如何在时间戳中添加/减去我的时区偏移量?
Input : 2017-09-13 13:10:30.333
Output: 2017-09-13 18:40:30.333
Run Code Online (Sandbox Code Playgroud)
解释 :在输入中,时区偏移量 5hrs 30mts 已添加到输入中。此外,输入是 Timestamp 类型,输出也是 Timestamp 类型。
我使用ZoneID.systemDefault()函数来检索 JVM 已知的时区。就我而言,时区结果是Asia/Calcutta.
小智 3
Ajava.sql.Timestamp没有任何时区信息。1970-01-01T00:00Z它只有一个值*:自 unix 纪元(或“UTC 1970 年 1 月 1日午夜” )以来的纳秒数。您无需将此值转换为时区,因为此数字未附加到任何特定时区。
打印 时Timestamp,它会调用该toString()方法,并打印 JVM 默认时区中相应的日期和时间。但是Timestamp本身没有附加时区。
请查看这篇文章以获取更多信息。它谈论java.util.Date,但概念是相同的:这些对象不携带任何格式或时区信息,因此您无法在时区之间转换它们。您可以更改的是表示形式这些值在不同区域中的
示例:如果我采取1505308230333000000自纪元以来的纳秒数。这个数字代表 UTC 的 13:10、圣保罗的 10:10、伦敦的 14:10、东京的 22:10、加尔各答的 18:40 等等。
该类Timestamp只保留大数值*。这个相同的值对应于每个时区的不同日期/时间,但它的值对于每个人来说始终相同。
这就是为什么Timestamp在不同区域之间转换是没有意义的:您的Timestamp对象已经代表UTC 的13:10和加尔各答的 18:40 (它包含与相应时区中的这些日期/时间相对应的大数值 - 改变该值将更改所有时区各自的本地日期/时间)。
您可以更改的是String这个大数值的表示形式(指定时区中相应的本地日期/时间)。
但是,如果您想获得String另一个时区的相应日期和时间,则可以使用这些java.time类。
首先,您需要将 转换java.sql.Timestamp为 a java.time.Instant,然后将其转换为时区,从而得到java.time.ZonedDateTime. String最后,我使用 a将其格式化为a java.time.format.DateTimeFormatter:
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");\n// convert the timestamp to a zoneddatetime\nZonedDateTime z = timestamp.toInstant().atZone(ZoneId.of("Asia/Calcutta"));\n// format it\nSystem.out.println(z.format(fmt)); // 2017-09-13 18:40:30.333\nRun Code Online (Sandbox Code Playgroud)\n\n输出是:
\n\n\n\n\n2017-09-13 18:40:30.333
\n
如果您已经知道要使用的时区(在本例中为Asia/Calcutta),请不要使用默认时区 ( ZoneID.systemDefault()) - 当然您可以根据需要使用它,但请记住,即使在运行时,因此最好始终明确您正在使用哪一个。
*实际上,将Timestamp大数值保留在两个字段中:一个用于秒值,另一个用于纳秒值。但这是一个实现细节,不会改变该值不附加到任何时区的概念,因此在区域之间进行转换是没有意义Timestamp的
| 归档时间: |
|
| 查看次数: |
16038 次 |
| 最近记录: |