在下面的代码中,我使用日历对象将时区初始化为GMT并相应地获取时间,但是当我放回日期对象时,它会自动转换为我的本地时区,即IST。
Calendar gmt = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
Date dt=gmt.getTime();
任何人都可以建议我在日期对象中保留GMT格式的方式。
答案 0 :(得分:2)
它会自动转换为我当地的时区,即IST
不,不是。 Date
对象没有时区 - 它只是一个时刻。
如果您在toString()
上致电Date
,您会看到系统本地时区,因为不幸的是Date.toString()
所做的...但时区不是存储在Date
。
如果您想在特定时区看到Date
的文字表示,请使用DateFormat
并设置您要使用的时区。
答案 1 :(得分:2)
其他答案都是正确的。 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方法使用默认的平台时区输出一个人类可读的时间戳,在内部只需很长时间。