在东部标准时间区获取XMLGregorianCalendar日期

4

我正在使用 TimeZone.setDefault(TimeZone.getTimeZone("EST")); 来获取时区 EST,并且它对我来说工作得很好。但是有时候,由于默认的 JVM 时区设置,即使在我的项目中没有人调用此方法,我也会得到时区 EDT。

public getTimeInEST(XMLGregorianCalendar date) {
    TimeZone.setDefault(TimeZone.getTimeZone("EST"));
    DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
    formatter.setTimeZone(TimeZone.getTimeZone("EST"));
    String newTime = formatter.format(date.toGregorianCalendar().getTime());
    Date newDate = null;
    try {
        newDate = formatter.parse(newTime);
        System.out.println("ESTDate : " + newDate)
    } catch(ParseException e) {
        System.out.println(e.getMessage);
    }
}

有没有其他方法可以获取以东部标准时间为时区的XMLGregorianCalendar日期,而不使用TimeZone.setDefault(TimeZone.getTimeZone("EST"))


你肯定不需要同时设置默认时区和调用 formatter.setTimeZone,对吧? - Andy Turner
我能够无误地获取东部标准时间,但我不想使用 TimeZone.setDefault(TimeZone.getTimeZone("EST")); 来获取东部标准时间。 - Ari
请注意,旧的日期时间类(例如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat)现在已经成为遗留系统,被Java.time类所取代。请参阅Oracle的教程 - Basil Bourque
1个回答

3

我猜你只需要将时区传递给toGregorianCalendar即可。我强烈建议使用完整的时区标识而不是缩写——毕竟,我猜你真正想要的是东部时间(EST和EDT),而不仅仅是EST。

另外,没有必要格式化字符串值然后解析它——你可以直接使用Calendar.getTime()

// Possibly...
public Date toDate(XMLGregorianCalendar date) {
    TimeZone zone = TimeZone.getTimeZone("America/New_York");
    Calendar calendar = date.toGregorianCalendar(zone, Locale.US, null);
    return calendar.getTime();
}

请注意,Date值并没有时区 - 它只是一个时间点。 Date.toString()的返回值会让人产生误解,因为它总是使用系统默认时区,但是“在东部时区的Date”这样的事情是不存在的。
我在注释中包含了“可能”的字眼,因为不太清楚你想要实现什么目标。如果XMLGregorianCalendar指定了日期/时间但没有时区,并且您想假设它实际上表示东部时区的值,并将其转换为时间点,那么此代码才有用。这是您想要的吗?

使用上述代码后,我得到了IST时区的时间。 - Ari
我正在传递XMLGregorianCalendar日期,我想要东部标准时间,但不使用TimeZone.setDefault(TimeZone.getTimeZone("EST"))。 - Ari
@UserJHa:您所说的“我想要东部标准时间”和“我正在获取IST中的时区”究竟是什么意思?请仔细阅读中间段落——如果您有一个java.util.Date值,那只是表示一个时间点,它没有时区。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接