新日期()和日历日期之间的区别
实践中以下两个日期之间的区别是什么?新日期()和日历日期之间的区别
Date date = new Date();
Date date = Calendar.getInstance().getTime();
我的理解是,新的Date()是当日历的getTime()是根据时区&系统时间基于UTC/GMT日期。我对吗?我还想念什么?
此外,如果我上面的理解是正确的,我可以说下面两个函数的最终结果是完全一样的吗?
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());
}
我很感激,如果你能指出我哪里错了解清楚&向我解释。因为我觉得这件事让我感到困惑。谢谢!
这两个日期之间完全没有区别。 (第二个在分配不使用的日历对象时当然有点浪费)。
java.util.Date的一个实例是绝对时间点。它不知道时区。在SimpleDateFormat上设置默认时区类似地不做任何事情,它使用默认的....默认值!
要尝试不同的术语来解释,与java.util.Date为
下午10点49分2013年12月19日UTC
而且
下午5:49 2013年12月19日美国东部时间
是完全相同的对象。完全相同的java.util.Date表示这两种人类可读的时间表示。只有在使用格式化程序来回切换时,人类可读的注意事项才会起作用。 (因此,为什么你设置时区的格式,而不是日期,日期有没有一个什么样的时区是指知识)。
如果我更改计算机的时区,是不是因此在SimpleDateFormat上设置默认时区会为最终结果更改某些内容(因为默认时区已更改)? –
当然,更改计算机的时区可能会改变输出,但是调用该函数并不重要,因为SimpleDateFormat反正会使用默认值。 – Affe
关于Java日历和日期
实用信息。如果你想操作Java程序中的不同日期将使用Java Calendar类。
我会尽量给你一些有关Java日历和日期类,工作代码示例的广为人知的事实的概述,您可以立即尝试。
有关Calendar类的基本信息由Java API提供。 Calendar类约为几天,几个月和几年。有人可能会问:是不是Date类关于相同?不完全...
Java日期和日历类之间有什么区别?
日期和日历的不同之处在于日期类在特定时间点上运行,而日历在两个日期之间运行。 Calendar类为您提供了在特定时间点与一组日历字段(如HOUR,YEAR,MONTH,DAY_OF_MONTH)之间进行转换的可能性。您还可以使用日历字段进行操作,例如获取您祖母生日的日期:)。
我想点一下日历和日期有些事情你应该知道的,哪些不是很明显...
闰秒。
年,月,日期和时间是在“正常”范围,如:
年份y - 1900 从1 0到11 日期(月日)一个月到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.或P.M.?午夜和中午A.M.或P.M?
答案:23:59是当天的最后一分钟,00:00是第二天的第一分钟。午夜属于“am”,中午属于“pm”,所以在同一天12:00 am(午夜)< 12:01 am和12:00 pm(中午)< 12:01 pm。
也许最后一个问题:什么是时代?为什么这个时代自1970年1月1日00:00:00:00格林威治时间。
其实这是Unix时间或POSIX时间,是在时间描述点的系统:它是秒数之后00:00:00 UTC,1月1日,1970年
等待,一个问题更多!
“如果我们使用自Epoch以来计算的时间,我怎么知道哪些年份有闰秒而哪些不是?
答:让生活更轻松闰秒不计算在内。 Java Date类从OS获取实际时间,大多数现代计算机不能使用闰秒,但它们的内部时钟不会精确。这就是为什么需要定期时间同步的原因。
只是一个关于闰秒的修正。第二个永远不能接受61的价值 - 这是早期posix版本的一个旧错误,同时也被纠正了。否则UT1和UTC之间的差异可能超过0.9s,这在UTC标准中是不允许的。不幸的是,这个错误仍然存在于java.util.Date的javadoc中。 –
当你尝试时会发生什么?提示:日期没有任何时区,无论您获得实例的方式如何。其他提示:无论时区是什么,当前时刻都是当前时刻。 –
日期/日历令人困惑,因为它们的设计和实施都很差。或者(a)[Joda-Time](http://www.joda.org/joda-time/)或(b)新的[JSR 310:日期和时间API](https://www.jcp.org/en/jsr/detail?id=310)java.time。*与Java 8捆绑在一起的类并取代了java.util.Date/Calendar混乱。 –