我有一个Date
对象使用方法getTime
来返回自1970年1月1日以来的毫秒数。
invoiceDate.getTime();
这些毫秒传递给java.sql.Date
构造函数,如下所示:
new java.sql.Date( invoiceDate.getTime() );
结果是 yyyy-MM-dd 格式的日期。
现在我的问题是,java.sql.Date
是否有可能产生一个错误?例如,假设 invoiceDate 设置为 Thu Jul 02 00:00:00 CDT 2015 ,那么java.sql.Date是否可能产生 2015- 07-01 ?
答案 0 :(得分:1)
没有。 Java日期不存储时区,因此您的invoiceDate和新日期对象相等。它在toString()中打印CDT,因为这是你的jvm
的时区另请参阅Date.getTime()
的文档返回自1970年1月1日00:00:00 GMT以来的毫秒数 由此Date对象表示。
for Date(long)
分配Date对象并初始化它以表示指定的对象 自标准基准时间以来被称为"的毫秒数 时代",即1970年1月1日00:00:00 GMT。
答案 1 :(得分:0)
没有。然而,它并不关心时区,这可能会产生一些问题。另请注意,数月从零开始计算,而天数则为1.
答案 2 :(得分:0)
6ton接受的答案是正确的。 java.util.Date和java.sql.Date上的toString
方法将JVM的当前默认时区静默应用于UTC区域†中的日期时间值。
这是许多的原因之一,以避免使用旧的java.util.Date/.Calendar和java.sql.Date。尝试使用Java 8及更高版本中的新java.time框架或第三方Joda-Time库来完成大部分工作。
如果您真正关心的是没有时间的日期,这意味着您的应用永远不会离开某个地区(时区),那么请使用仅限日期的课程。旧的日期时间类缺乏这个。 java.time和Joda-Time都提供了这样一个仅限日期的类,都叫做LocalDate
。
在StackOverflow上已多次讨论使用LocalDate
这种方式。请搜索更多信息。
†在java.util.Date源代码中实际上有一个深度分配的时区,但是在大多数情况下它会被忽略。混乱?是。然而另一个的理由是避免这些旧课程。