时区如何影响使用零 (0L) 的开始纪元计数的新日期



下面的代码在印度返回"1970-01-01"表示0L,在加拿大返回"1969-12-31"。我不知道这里出了什么问题,谁能告诉我这里有什么问题。我怀疑这是因为时区问题,但需要更多信息。

public static RestEDate convertLongDateToStringDate(long lDate) {
    String returnDate = "";
    if (lDate >= 0) {
        returnDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date(lDate));
    }
    return new RestEDate(returnDate);
}

是的,这是一个时区问题。您的SimpleDateFormat实例默认为当前时区。1970年1月1日午夜0L(格林威治标准时间)是加拿大东海岸1969年12月31日19:00(GMT-0500)和加拿大西海岸1969年12月31日16:00(GMT-0800)。Date实例是正确的,但如何解释取决于格式化程序使用的时区。

要设置SimpleDateFormat使用的时区(例如,GMT),请使用其setTimeZone方法(如果您周围已有要使用的Calendar,则setCalendar)。

T.J. Crowder的回答是正确的。

Joda-Time || java.time> java.util.Date

最好使用 Joda-Time 库或 Java 8 中内置的类似 java.time 包。 两者都远远优于java.util.Date和。日历类。

分配时区

在这两个库中,日期时间对象知道它自己分配的时区。如果未指定,那么将应用 JVM 的缺省时区。最好指定所需的时区,而不是隐式依赖默认值。

使用正确的时区名称。避免使用既不标准化也不唯一的常见 3 或 4 字母代码。

在下面的示例中,蒙特利尔比 UTC 晚 5 小时。

乔达时间示例

下面是一个 Joda-Time 2.6 示例。

DateTimeZone zoneMontreal = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeZeroInMontreal = new DateTime( 0L, zoneMontreal );
DateTime dateTimeZeroInUtc = dateTimeZeroInMontreal.withZone( DateTimeZone.UTC );  

运行时。

dateTimeZeroInMontreal : 1969-12-31T19:00:00.000-05:00
dateTimeZeroInUtc : 1970-01-01T00:00:00.000Z

最新更新