我尝试使用GMT时区实例化GregorianCalendar,但每当我调用getTime()方法时,它都会以本地时区给出时间。这是我的代码:
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
System.out.println(cal.getTime());
我得到的输出是这样的:
Sat Nov 28 19:55:49 PKT 2009
Please help!
我尝试使用GMT时区实例化GregorianCalendar,但每当我调用getTime()方法时,它都会以本地时区给出时间。这是我的代码:
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
System.out.println(cal.getTime());
Sat Nov 28 19:55:49 PKT 2009
Please help!
我不确定这是否回答了你的问题,但这是一种获取GMT中的“现在时间”的方法。
import java.text.*
import java.util.*
Calendar cal = new GregorianCalendar();
Date date = cal.getTime();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(formatter.format(date));
查看SimpleDateFormat的Javadoc以获取不同的格式。此外,考虑使用Joda Time,因为它在处理日期和时间方面优于SimpleDateFormat。
GregorianCalendar
,而是在于Date
。为了对println
中的日期/时间进行格式化,使用了Date
。DateFormat
——我总是使用SimpleDateFormat
,因为我非常挑剔我的日期外观。DateFormat
的一个getInstance...
工厂方法。DateFormat
(当然包括SimpleDateFormat
)上明确地setTimeZone
。getTime()
,它返回 Date 类型,正如你所说,应该避免使用。 - Bozhojava.time.Instant.now()
将返回当前的GMT时间。 - rsinhaInstant.now().toString()
2020-03-08T00:21:48.647951Z
java.util.Date::toString
说了谎话你调用 GregorianCalendar::getTime
返回一个 java.util.Date
。正如你从这个方法和类名中看到的那样,这些类的设计非常糟糕。
然后你隐式地调用了 Date::toString
方法来生成表示该对象内部值的文本。该值实际上是UTC时间,仅是自1970年第一时刻以来的毫秒数。不幸的是,该方法在生成文本时动态应用JVM的当前默认时区。这会产生该时区包含在对象中的错觉。
令人困惑吗?是的。这是永远不要使用这些遗留的日期时间类的众多原因之一。请改用java.time类。
Date
、Calendar
、GregorianCalendar
和 SimpleDateFormat
类在多年前被现代的 JSR 310 中定义的 java.time 类所取代。Instant
。这个基本构建块类在 java.time 中总是处于 UTC 时区,根据定义。Instant instant = Instant.now() ;
toString
方法生成一个符合 ISO 8601 标准的字符串格式。String output = instant.toString() ;
2020-03-08T00:21:48.647951Z
要生成更灵活的字符串格式,请使用OffsetDateTime
类。搜索Stack Overflow了解DateTimeFormatter
。
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;