java - 格式化日历对象而不是日期对象?

标签 java calendar formatting simpledateformat

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

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

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

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

每当调用 Calendar.getTime() 方法时,返回的 Date 始终采用本地时区,无论 Calendar 的时区如何.

因此,当我将其传递给 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接受日历,或者有办法获取不在本地时区的日期,或者是否有另一个类我应该一起使用这种格式?

最佳答案

Whenever one calls the Calendar.getTime() method, the Date returned is always in the local time zone, regardless of the time zone of the Calendar.

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

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

formatter.setTimeZone(calendar.getTimeZone());

...或者只是设置要完全使用的日历:

formatter.setCalendar(calendar);

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

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

关于java - 格式化日历对象而不是日期对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12964629/

相关文章:

PHP 注释格式 : auto generated or User created?

python - 是否可以使用 weasyprint 对页脚进行精美的格式化?

java - 在 Netbeans 中构建 xml 和 build-impl.xml

Java 6 SE vector 过时了吗?

datetime - Groovy - 惯用的编码方式最后一个工作日 - 月初

java - java 的时区

c# - 单击按钮(而不是单击单元格)更改 dataGridView 单元格格式

java - 设置每天 map 标记的最大数量

java - Android - 自定义 ListView Viewholder

java - 在Java中从给定的Date对象构造字符串