以下两个日期在实践中有什么区别?
Date date = new Date();
Date date = Calendar.getInstance().getTime();
据我所知,新的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());
}
如果你能指出我错误理解的地方,我感激不尽。向我解释清楚。因为我觉得这件事让我很困惑。谢谢!
答案 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.Date2013年12月19日10:49 UTC
和
2013年12月19日下午5点49分美国东部时间
是完全相同的对象。完全相同的java.util.Date表示那些人类可读的时间表示。只有当您使用格式化程序来回转换它时,人类可读的注意事项才会发挥作用。 (因此,为什么要在格式化程序上设置时区,而不是在日期,日期不知道时区的含义。)