3

我正在编写一个程序,该程序涉及将 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而不是示例中提到的日期....可能是什么原因......并且有解决方案吗......???

4

4 回答 4

1

好吧,在纪元时间内,“0”相当于 1970 年 1 月 1 日。当您尝试解析它时,任何早于该日期的日期都会出现负数。

尝试将您正在解析的日期字符串更改为 1970 年之后的任何日期,您将获得正确的值。

于 2012-06-27T18:11:48.593 回答
1

文档说负值对 java.sql.Date 的构造函数和 setTime 方法有效:

http://docs.oracle.com/javase/6/docs/api/java/sql/Date.html#setTime(long )

我希望使用“00/00/0000”作为日期是一个问题,因为没有零月、日或年。

http://en.wikipedia.org/wiki/0_ (年份)

于 2012-06-27T18:11:56.817 回答
1

如果将“00”解析为月份,则将其视为十二月。“00”日是上个月的最后一天,因此组合被解析为 11 月 30 日。至于零年,请参见java 中的 Year 0000。.getTime() 的负值完全没有问题。

于 2012-06-27T18:25:32.577 回答
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处理月份,1January.
  • 它以循环方式处理年、月和日,这与处理方式intlong处理方式非常相似。

在此处输入图像描述

为了完整起见,请查看以下语句的输出:

System.out.println(Integer.MAX_VALUE + 1); // -2147483648
System.out.println(Integer.MIN_VALUE - 1); // 2147483647

基于这个概念,这就是SimpleDateFormat解析的方式00/00/2021

  • 月,00回到上个月,即 12 月,这也意味着年份将变为 2020。
  • Day-of-month, 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。您想查看此答案以获得更多解释。

在使用旧的日期时间 API 时,您会遇到许多这样的惊喜。由于这些原因,建议完全停止使用它并切换到java.time现代日期时间 API *

java.time

让我们看看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));
    }
}

输出:

线程“主”java.time.format.DateTimeParseException 中的异常:无法解析文本“00/00/0000”:MonthOfYear 的值无效(有效值 1 - 12):0

Trail: Date Time了解更多关于java.time现代日期时间 API 2.的信息。


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 desugaringHow to use ThreeTenABP in Android Project

于 2021-05-22T12:17:42.713 回答