新Date()和日历日期之间的差异

时间:2013-12-19 22:41:59

标签: java date calendar timezone

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

  1. Date date = new Date();

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

  3. 据我所知,新的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());
    }
    

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

2 个答案:

答案 0 :(得分:9)

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

如果要在Java程序中使用不同的日期,则将使用Java Calendar类。

我将尝试向您概述一些关于Java Calendar和Date类的广为人知的事实,工作代码示例,您可以立即尝试。

有关Calendar类的基本信息由Java API提供。 Calendar类大约是几天,几个月和几年。有人可能会问:Date类不是一样的吗?不完全是......

Java Date和Calendar类之间有什么区别?

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

我想指出一些你应该知道的日历和日期,哪些不明显......

闰秒。

年,月,日和小时处于“正常”范围内,如:

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

Lenient fields。

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

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

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

答案:23:59是当天的最后一分钟,00:00是第二天的第一分钟。午夜属于“am”,中午属于“pm”,因此在同一天,凌晨12:00(午夜)<上午12:01和中午12:00(中午)<下午12:01。

可能最后一个问题:什么是时代?以及为什么这个时代从1970年1月1日00:00:00.000 GMT。

实际上是Unix时间或POSIX时间是用于描述时间点的系统:它是1970年1月1日00:00:00 UTC之后的秒数。

等等,还有一个问题!

“如果我们使用自Epoch以来计算的时间,我怎么知道哪些年份有闰秒而哪些年份没有?”

答案:为了让生活更轻松,闰秒不计算在内。 Java Date类占用OS的实际时间,大多数现代计算机都不能使用闰秒,它们的内部时钟不是那么精确。这就是为什么需要定期进行时间同步的原因。

答案 1 :(得分:1)

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

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

尝试用不同的术语解释,

的java.util.Date

2013年12月19日10:49 UTC

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

是完全相同的对象。完全相同的java.util.Date表示那些人类可读的时间表示。只有当您使用格式化程序来回转换它时,人类可读的注意事项才会发挥作用。 (因此,为什么要在格式化程序上设置时区,而不是在日期,日期不知道时区的含义。)