有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java初始化日期和日期(毫秒)构造函数

日期类的JavaDoc声明

public Date(long date)
Allocates a Date object and initializes it to represent the specified number of         
milliseconds since the standard base time known as "the epoch", namely January 1, 1970,   
00:00:00 GMT.

下面的代码通过使用Date(long millises)构造函数计算毫秒数来计算1月24日和1月25日的日期

public static void main(String[] args) throws java.text.ParseException {

    long milliSecFor25 = (24*60*60*24*1000);
    long milliSecFor26 = (25*60*60*24*1000);
    Date dateJan25 = new Date(milliSecFor25);
    Date dateJan26 = new Date(milliSecFor26);
    System.out.println("Date for Jan 25:" + dateJan25);
    System.out.println("Date for Jan 26:" + dateJan26);
}

在执行下面的代码时,我得到下面的输出

    Date for Jan 25: Sun Jan 25 05:30:00 IST 1970
    Date for Jan 26: Sun Dec 07 12:27:12 IST 1969

这是不正确的。有人能解释一下为什么我找不到1月25日的正确日期吗


共 (2) 个答案

  1. # 1 楼答案

    你有一个整数溢出。使用long而不是int:

    long milliSecFor25 = (24L * 60L * 60L * 24L * 1000L);
    
  2. # 2 楼答案

    问题在于:

    25*60*60*24*1000
    

    所有这些都是在整数算术中执行的,并且该值溢出

    您可以看到,如果改为使用long值执行算术,并显示与Integer.MAX_VALUE比较的结果:

    milliSecFor26 = (25*60*60*24*1000L);
    System.out.println("Millis: " + milliSecFor26);
    System.out.println("Integer.MAX_VALUE: " + Integer.MAX_VALUE);
    

    印刷品:

    Millis: 2160000000
    Integer.MAX_VALUE: 2147483647
    

    因此,您的int算法实际上溢出到了一个值,这就是为什么您在Unix纪元之前看到了一个Date

    旁白:

    • 您可以使用TimeUnit.DAYS.toMillis(26)作为更干净的计算方法
    • 在Java标准库(Java 8之前)中,您应该使用Calendar从年/月/日获取适当的Date
    • Joda Time是一个比Date/Calendar更好的
    • Java8将有一个even cleaner date/time API(在java.time包中)