我编写的程序涉及将java.util.Date转换为java.sql.Date ......
我使用getTime()方法完成了它...
java.util.Date dt = new java.util.Date();
java.text.DateFormat df = new java.text.SimpleDateFormat("dd/MM/yyyy");
dt=df.parse("06/12/0785");
java.sql.Date sqldate = new java.sql.Date(dt.getTime());
System.out.print("\n\n\n "+dt.getTime()+" "+sqldate);
我获得了dt.getTime()
的负值,sqldate
的值正确...
我怀疑是
`Is it safe to use negative seconds as epoch or is it vulnerable to bugs while implementing it in database in any way.....???
和 的
在设置日期将sqldate的错误日期打印为00/00/0000
而不是示例中提到的那个....可能是什么原因......并且有解决方案...... .... ???
答案 0 :(得分:1)
那么,在大纪元时间,“0”将相当于1970年1月1日。当你试图解析它时,任何比这更早的日期会出现负数。
尝试将您要解析的日期字符串更改为1970年后的任何日期,您将获得正确的值。
答案 1 :(得分:1)
文档说负值对java.sql.Date的构造函数和setTime方法有效:
http://docs.oracle.com/javase/6/docs/api/java/sql/Date.html#setTime(long)
我希望使用“00/00/0000”作为日期是一个问题,因为没有零月,日或年。
答案 2 :(得分:1)
如果您将月份解析为“00”,则将其视为12月。 “00”日是上个月的最后一天,因此组合将被解析为11月30日。至于零年,请参阅Year 0000 in java。 .getTime()的负值完全没问题。
答案 3 :(得分:0)
旧的日期时间 API(java.util
日期时间类型及其格式类型,SimpleDateFormat
等)已经过时且容易出错。让我们首先了解 SimpleDateFormat
如何错误地处理像 00/00/0000
这样的字符串,然后我们将介绍现代日期时间 API 如何防止尝试处理这样的无效字符串。
以下演示将帮助我们轻松理解概念和问题:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class Main {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdfInput = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
SimpleDateFormat sdfOutput = new SimpleDateFormat("dd MMMM yG", Locale.ENGLISH);
System.out.println(sdfOutput.format(sdfInput.parse("00/00/2021")));
}
}
输出:
30 November 2020AD
关于SimpleDateFormat
的一些事实:
SimpleDateFormat
处理月份,1
作为 January
。int
和 long
的方式非常相似。为了完整起见,请查看以下语句的输出:
System.out.println(Integer.MAX_VALUE + 1); // -2147483648
System.out.println(Integer.MIN_VALUE - 1); // 2147483647
基于这个概念,SimpleDateFormat
是这样解析 00/00/2021
的:
00
:返回上个月,即 12 月,这也意味着该年将成为 2020 年。00
:返回上个月的最后一天,这也意味着 12 月将移回一个位置,成为 11 月和 11 月的最后一天是 30。因此,输出将为 30 November 2020AD
。
测验:输入字符串 -01/-01/2021
的输出是什么?
如果您的答案是:30 October 2020AD
,那么您的理解是正确的。
下面给出了更多示例:
SimpleDateFormat sdfInput = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
SimpleDateFormat sdfOutput = new SimpleDateFormat("dd MMMM yG", Locale.ENGLISH);
System.out.println(sdfOutput.format(sdfInput.parse("00/00/0000"))); // 30 November 2BC
System.out.println(sdfOutput.format(sdfInput.parse("00/-01/2021"))); // 31 October 2020AD
System.out.println(sdfOutput.format(sdfInput.parse("00/13/2021"))); // 31 December 2021AD
System.out.println(sdfOutput.format(sdfInput.parse("00/14/2021"))); // 31 January 2022AD
为什么是2BC
?
幸运的是1.没有年-0。在 1AD 之前,我们有 1BC。所以,我们知道第 0 年为 1BC。如果你回到一年前,那就是 2BC。您想查看 this answer 以获得更多解释。
在使用旧的日期时间 API 时,您会遇到许多这样的惊喜。由于这些原因,建议完全停止使用它并切换到java.time
,modern date-time API*。
让我们看看 java.time
,现代 API 如何防止尝试处理这样的无效字符串:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
LocalDate.parse("00/00/0000", DateTimeFormatter.ofPattern("dd/MM/uuuu", Locale.ENGLISH));
}
}
输出:
<块引用>线程“main”中的异常java.time.format.DateTimeParseException: 无法解析文本“00/00/0000”:MonthOfYear 的值无效 (有效值 1 - 12):0
从 modern date-time API 中详细了解 java.time
,Trail: Date Time2.。
1。否则,它会在关于第 0 年应该称为 0AD 还是 0BC 的问题上打开一堆蠕虫。
2.出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7。如果您正在工作对于 Android 项目并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。