【问题标题】:Java - Creating a Calendar without a TimeZoneJava - 创建没有时区的日历
【发布时间】:2012-07-10 15:38:15
【问题描述】:

首先我想说我已经阅读了几个与此类似的主题,但没有一个能真正解决我的问题。 我还要声明,我尝试使用 SimpleDateFormatjoda.DateTime 没有任何成功。

问题如下:

我有一个包含特定日期信息的日历对象:2008-04-30T00:00:00Z 当使用calendar.getTime() 方法时,我可以得到不同的结果,因为我知道该方法正在寻找本地值

因此:

UK: 2008-04-30T01:00:00.000+0100

US: 2008-04-30T20:00:00.000-0400

但我想要一个 Date 对象,它只包含日期和时间值“2008-04-30T00:00:00”,完全忽略任何时区。

我该怎么做?

正如我之前提到的,我尝试使用 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") 但我总是得到相同的结果。

任何帮助将不胜感激 干杯。

【问题讨论】:

  • 你能提供你试过的例子吗?
  • 我尝试了以下方法: SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); sf.setTimeZone(TimeZone.getTimeZone("UTC")); sd.parse(值); //值为'2008-04-30T00:00:00Z'
  • 日历不能没有时区。日历的概念取决于时区,否则就毫无意义。

标签: java datetime timezone


【解决方案1】:

发现您可以使用以下代码清除时区:

Calendar cal = Calendar.getInstance(); cal.clear(Calendar.ZONE_OFFSET);

【讨论】:

  • 这实际上帮助了我——这在我们不需要关心时区的应用程序中真的很有帮助。除了时区——我们还可以清除很多其他的东西,比如小时、分钟、毫秒——所有这些字段都可以在这里找到docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
【解决方案2】:

CalendarsDates 没有 TimeZone 就没有任何意义。

日历和日期不能在没有时区的情况下存在。

你不能ignore completely any timezone

您可以像这样为格林威治标准时间(偏移量为零)创建日历:

    TimeZone zone = TimeZone.getTimeZone("Etc/GMT");
    Calendar cal = Calendar.getInstance(zone);

这表示仅在 GMT 时区有意义的日期/日历。

听起来你想要一个时间戳,它代表一个瞬间。

【讨论】:

  • 这是一个糟糕的答案,因为您可以清楚地使用没有时区的日期,然后使用具有清除时区信息的日历来实际使用值。如果您的应用程序只存在于一个时区,您可以放心地忽略时区。问题是,当您获得 Date 值并且您忽略该日期的时区(您获得长值)时,Calendar 将在您的时区中关闭所有操作。
【解决方案3】:

您是否使用标准构造函数来初始化日历?如果你使用允许指定时区和语言环境的构造函数呢?

protected Calendar(TimeZone zone, Locale aLocale)

【讨论】:

  • 我实际上也尝试过这样做:CALENDAR.getInstance(TIME_ZONE_UTC, Locale.UK);但这返回与以下相同的值: UK: 2008-04-30T01:00:00.000+0100
  • 每个 Calendar 实例总是有一个与之关联的 TimeZone。他们就是这样工作的。
【解决方案4】:

正如其他人指出的那样,CalendarDate 对象不能在没有时区的情况下存在。

我相信您可能希望将 Java 8 中引入的 LocalDateTime 类与新的时间 API 一起使用:

LocalDateTime literal = LocalDateTime.of(2008, 4, 30, 0, 0, 0);
LocalDateTime parsed = LocalDateTime.parse("2008-04-30T00:00:00"); // ISO-8601 by default
Assert.assertEquals(literal, parsed);

【讨论】:

    【解决方案5】:

    旧的,但仍然不正确。

    “当使用 calendar.getTime() 方法时,我可以得到不同的结果,因为我知道该方法正在寻找本地值”

    这是一种误解。 getTime() 将仅获得毫秒。计为 GMT。

    仅在格式化输出时时区才相关。 Sind原贴没有显示代码,无法确定,哪里出错了。

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 2017-11-09
      相关资源
      最近更新 更多