使用java epoch秒为负数

时间:2012-06-27 18:04:23

标签: java epoch java.util.date

我编写的程序涉及将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 个答案:

答案 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”作为日期是一个问题,因为没有零月,日或年。

http://en.wikipedia.org/wiki/0_(year

答案 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
  • 它以循环方式处理年、月和日,这与处理 intlong 的方式非常相似。

enter image description here

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

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.timemodern date-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));
    }
}

输出:

<块引用>

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

modern date-time API 中详细了解 java.timeTrail: 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 desugaringHow to use ThreeTenABP in Android Project