如何将Date对象设置为指向java中的不同时区

时间:2016-01-12 16:12:02

标签: java date datetime time timezone

在下面的代码中,我使用日历对象将时区初始化为GMT并相应地获取时间,但是当我放回日期对象时,它会自动转换为我的本地时区,即IST。

Calendar gmt = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
Date dt=gmt.getTime();

任何人都可以建议我在日期对象中保留GMT格式的方式。

3 个答案:

答案 0 :(得分:2)

  

它会自动转换为我当地的时区,即IST

不,不是。 Date对象没有时区 - 它只是一个时刻。

如果您在toString()上致电Date,您会看到系统本地时区,因为不幸的是Date.toString()所做的...但时区不是存储在Date

中的信息

如果您想在特定时区看到Date的文字表示,请使用DateFormat并设置您要使用的时区。

答案 1 :(得分:2)

java.time

其他答案都是正确的。 toString方法以静默方式应用JVM的当前默认时区。这是旧日期时间类中许多糟糕的设计选择之一。转储那些旧课程。转到Java 8及更高版本中内置的java.time框架。

Instant是UTC时间线上的一个时刻。

Instant now = Instant.now();

将时区(ZoneId)应用于Instant以获得ZonedDateTime

如果ZonedDateTime已经是UTC,为什么还要在UTC中创建Instant?因为ZonedDateTime使您可以灵活地格式化日期时间值的字符串表示形式。 java.time.format 包不适用于Instant个对象。

ZoneId的子类ZoneOffset具有UTC的常量。

ZonedDateTime zdtUtc = ZonedDateTime.ofInstant(  ZoneOffset.UTC );

调整到任何所需的时区。

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdtKolkata = ZonedDateTime.ofInstant( instant , zoneId );

使用正确的时区名称

避免使用3-4个字母代码作为时区。它们既不标准也不独特。 IST你的意思是印度标准时间爱尔兰标准时间

使用standard time zone names。大多数都是大陆/地区的模式。对于印度,Asia/Kolkata。对于爱尔兰,Europe/Dublin

答案 2 :(得分:1)

Date类不代表时区。它的toString方法使用默认的平台时区输出一个人类可读的时间戳,在内部只需很长时间。