1

我需要发送带有时区的日历对象,例如Tue Mar 03 13:43:00. 我知道 Calendar 对象总是返回Tue Mar 03 13:43:00 CST 2009,那么如何在没有时区的情况下创建它?

4

4 回答 4

1

没有 TimeZone 的 Calendar 对象是不可能的。真的,这没有任何意义——日历试图表示“特定的时间瞬间”——你怎么能在不知道你所代表的时间所在的 TimeZone 的情况下及时表示一个实例?

所以,有几点需要考虑:

  1. 您说您需要将此日历传递给其他一些组件-该 API 是否关心日历所在的 TimeZone?该 API 是否会忽略 TimeZone 设置,使用它来计算与它自己的本地时区的时差等?
  2. 您是否知道可以轻松更改日历实例的时区?

    Calendar cal = Calendar.getInstance();
    cal.setTimeZone(TimeZone.getDefault()); // returns default TimeZone for your system
    cal.setTimeZone(TimeZone.getTimeZone("EST")); // Eastern Standard Time
    cal.setTimeZone(TimeZone.getTimeZone("Asia/Kolkota"); // UTC+5:30
    

CalendarTimeZone上的 Javadocs 。

于 2009-03-07T04:47:52.580 回答
1

您可以使用DateFormat类(更具体地说是SimpleDateFormat具体子类)来根据需要格式化日期。这是一个例子:

Calendar cal = Calendar.getInstance();
DateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss");

String dateString = format.format(cal.getTime()));

印刷:

周五 3 月 6 日 15:50:26
于 2009-03-06T20:34:58.257 回答
0

您可以使用简单的 Date 对象;

Date d = new Date();
Date d2 = calendar.getTime();

或者更简单的,以毫秒为单位的时间。

long time = System.currentTimeMillis();

为避免时区混淆,我建议将所有日期/时间存储并设置为标准时区,例如 GMT+0,然后根据需要转换显示时间等。

于 2009-03-06T21:14:11.563 回答
0

在重新阅读您的问题和您对我的其他答案的评论后,听起来问题是您希望结果是日历对象,而不是字符串。所以这不是格式化日历的字符串表示的问题。

在这种情况下,您要问的问题在技术上是不可能的:Calendar 类的所有实现都存在以表示内部时间,该时间存储为自 Unix 纪元(1970 年 1 月 1 日 00:00 GMT)以来的毫秒数。波士顿的时间“5:00 am”与西雅图的“5:00 am”不同——它们有不同的内部时间戳。

您最好的选择是在任何地方都使用相同的时区,而 GMT 可能最适合此目的:

cal.setTimeZone(TimeZone.getTimeZone("GMT+0000"));
于 2009-03-06T21:22:52.087 回答