【问题标题】:Difference between new Date() and Calendar datenew Date() 和日历日期之间的区别
【发布时间】:2014-01-08 16:42:56
【问题描述】:

在实践中,以下两个日期有什么区别?

  1. Date date = new Date();

  2. Date date = Calendar.getInstance().getTime();

我的理解是 new Date() 是基于 UTC/GMT 的日期,而日历的 getTime() 基于 TimeZone 和系统时间。我对吗?我还想念什么吗?

另外,如果我上面的理解是正确的,我能说下面两个函数的最终结果是完全一样的吗?

1.

public String getDate1(){
   SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd");
   //I set the time zone & pass the new Date()
   sdf.setTimeZone(TimeZone.getDefault()); 
   return sdf.format(new Date());
}

2.

public String getDate2(){
  SimpleDateFormat sdf =  new SimpleDateFormat("yyyy-MM-dd");
  //I didn't set the time zone because I think calendar instance will handle timezone change
  return sdf.format(Calendar.getInstance().getTime());
}

如果您能指出我理解错误的地方并清楚地向我解释,我将不胜感激。因为我觉得这件事让我很困惑。谢谢!

【问题讨论】:

  • 尝试时会发生什么?提示: Date 没有任何时区,无论您以何种方式获取它的实例。其他提示:无论时区是什么,当前时刻就是当前时刻。
  • 日期/日历令人困惑,因为它们的类设计和实现都很差。省去麻烦,避免使用这些类并改用像样的库:(a) Joda-Time 或 (b) 与 Java 8 捆绑在一起并取代 java.util.Date/ 的新 JSR 310: Date and Time API java.time.* 类日历混乱。

标签: java date calendar timezone


【解决方案1】:

这两个日期之间完全没有区别。 (第二个当然在分配一个你不使用的 Calendar 对象时有点浪费。)

java.util.Date 的一个实例是一个绝对时间点。它不知道时区。在 SimpleDateFormat 上设置默认时区同样没有任何作用,它使用默认时区......默认!

为了尝试用不同的术语来解释,java.util.Date 用于

UTC 时间 2013 年 12 月 19 日晚上 10:49

美国东部时间 2013 年 12 月 19 日下午 5:49

是完全相同的对象。完全相同的 java.util.Date 代表了这两种人类可读的时间表示。只有当您使用格式化程序来回转动它时,人类可读的考虑才会发挥作用。 (因此,为什么您在格式化程序上设置时区,而不是在日期上,日期不知道时区的含义。)

【讨论】:

  • 如果我更改计算机的时区,是不是在 SimpleDateFormat 上设置默认时区会改变最终结果(因为默认时区已更改)?
  • 当然,更改计算机的时区可能会更改输出,但调用该函数并不重要,因为 SimpleDateFormat 无论如何都会使用默认值。
【解决方案2】:

有关 Java 日历和日期的实用信息

如果你想在你的 Java 程序中操作不同的日期,你将使用 Java Calendar 类。

我将尝试为您提供一些关于 Java 日历和日期类的不广为人知的事实的概述,工作代码示例,您可以立即尝试。

Calendar 类的基本信息由 Java API 提供。日历类大约是几天、几个月和几年。有人会问:是不是 Date 类差不多?不完全是……

Java Date 和 Calendar 类有什么区别?

Date 和 Calendar 之间的区别在于 Date 类以特定的时间点运行,而 Calendar 类以两个日期之间的差异运行。 Calendar 类使您可以在特定时刻和一组日历字段(例如 HOUR、YEAR、MONTH、DAY_OF_MONTH)之间进行转换。您还可以使用日历字段进行操作,例如获取您祖母的生日日期:)。

我想指出一些关于日历和日期的事情,你应该知道并且不明显......

闰秒。

年、月、日和小时都在“正常”范围内,例如:

一年 y - 1900。 一个月从0到11 以通常方式从 1 到 31 的日期(月份中的某天)。日历闰秒 0 到 23 小时。 以通常的方式从 0 到 59 分钟。 但是,注意!!秒由 0 到 61 的整数表示。看起来很奇怪 - 61 秒,但不要忘记闰秒。大约每隔一两年就会有一个额外的一秒,称为“闰秒”。闰秒总是作为一天的最后一秒添加,并且总是在 12 月 31 日或 6 月 30 日。例如,由于添加了闰秒,1995 年的最后一分钟是 61 秒。

宽松的字段。

另一个有趣的功能是日历中的宽松和非宽松字段。那是什么?示例:

2006 年 1 月 32 日。实际上,如果您将日历设置为宽松,它将是 2006 年 2 月 1 日,并且您的程序没有问题 :)。如果是非宽松的 ArrayIndexOutOfBoundsException 会抛出异常。

另一个问题是 00:00 结束还是开始?是 00:00 A.M.还是下午?是午夜和中午 A.M.还是下午?

答案:23:59 是一天的最后一分钟,00:00 是第二天的第一分钟。午夜属于“am”,中午属于“pm”,所以在同一天,12:00 am(午夜)

可能还有最后一个问题:什么是纪元?以及为什么从 1970 年 1 月 1 日 00:00:00.000 GMT 开始这个纪元。

其实是 Unix 时间,或者 POSIX 时间,是一种描述时间点的系统:它是 1970 年 1 月 1 日 00:00:00 UTC 之后的秒数。

等等,还有一个问题!

“如果我们使用从纪元开始计算的时间,我怎么知道哪些年份有闰秒,哪些没有?”

答案:为了方便起见,闰秒不计算在内。 Java Date 类从操作系统获取实际时间,大多数现代计算机不能使用闰秒,它们的内部时钟不是那么精确。这就是需要定期时间同步的原因。

【讨论】:

  • 只是关于闰秒的更正。第二个永远不能接受值 61 - 这是早期 posix 版本的一个老错误,同时更正了。否则 UT1 和 UTC 之间的差异可能超过 0.9 秒,这在 UTC 规范中是不允许的。这个错误在 java.util.Date 的 javadoc 中仍然存在,不幸的是。
猜你喜欢
  • 1970-01-01
  • 2017-02-14
  • 2019-11-12
  • 2020-03-12
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多