1

我正在尝试格式化日历字符串以指示我本地以外的时区偏移量。我知道我可以创建一个简单的格式化字符串并使用该Calendar.get(int)方法填充所有值,但这感觉不是正确的方法。

Java 有一个DateFormat,特别是我正在尝试使用SimpleDateFormat. 问题是format()这些类的方法需要一个Date对象。

我主要使用Calendar对象,因为我相信这些是 Java 中推荐的结构。所以,当我去格式化我的结果时间时,我调用Calendar.getTime()它返回一个Date可以传递给对象的SimpleDateFormat对象。

到目前为止,我认为这非常简单,但问题就在这里。

每当调用该Calendar.getTime()方法时,Date返回的始终是本地时区,与Calendar.

因此,当我将时间传递给 my 时,我总是会在本地时区打印时间SimpleDateFormat,这不是我想要的。到目前为止我所做的所有研究都说它无法完成,我所看到的所有示例都只是使用该Calendar.get(int)方法来填补一些空白。这看起来很糟糕,如果 DateFormat 类如此无用,为什么还要使用它?

这是一些示例代码,因此您可以了解我的意思,将其粘贴到您最喜欢的测试类中:

private static final SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

public static void main(String[] args)
{
    try
    {
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));
        cal.setTimeInMillis(parser.parse("2012-10-09T22:01:49.108-0700").getTime());
        System.out.println(formatter.format(cal.getTime()));
    }
    catch(ParseException e)
    {
        e.printStackTrace();
    }
}

产生的输出(因为我在中央时区运行):2012-10-10T00:01:49-0500
预期输出(无论从哪个时区运行):2012-10-10T01:01:49-0400

总结问题:有没有办法让 Java 中的 DateFormat 接受日历,或者获取不在本地时区的日期,或者是否有另一个类我应该完全用于这种格式?

4

3 回答 3

3

每当调用 Calendar.getTime() 方法时,返回的日期总是在本地时区,与日历的时区无关。

不,这不对。Date没有区。这只是自 Unix 纪元以来的毫秒数。它的toString()方法确实将其转换为本地时区,但这不是Date对象中信息的一部分。

您需要做的就是将格式化程序的时区设置为与日历的时区相同。

formatter.setTimeZone(calendar.getTimeZone());

...或者只是将日历设置为完全使用:

formatter.setCalendar(calendar);

(我不清楚后一种方法是否意味着日历会失去其价值......基本上Java类将“日历系统”、“时区”和“日历内的值”混合在一个类型中,这很不幸。)

不过,我同意 Ian 的观点,因为 Joda Time 是一个使用起来愉快的 API。

于 2012-10-18T22:30:33.263 回答
0

我会为此放弃内置的 java 日期和时间类,而改用joda time。它旨在正确处理 ISO8601 格式字符串,并正确处理时区。

于 2012-10-18T22:23:20.003 回答
0

Date 没有任何 TimeZone,它只是自 Epoch 时间以来的毫秒数,以人类可读的格式表示。我们可以使用“DateFormat”类。

 TimeZone tz = TimeZone.getTimeZone("America/Buenos_Aires");
 Calendar cal = Calendar.getInstance(tz);
 Date d = cal.getTime();
 DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm aaa");
 df.setTimeZone(tz);
 String s = df.format(cal.getTime());
 System.out.println(s);
于 2012-12-20T17:42:51.593 回答