年份中的Java毫秒数

Kev*_*sox 26 java

我正在使用毫秒进行Java中的日期计算,并注意到以下问题:

private static final int MILLIS_IN_SECOND = 1000;
    private static final int SECONDS_IN_MINUTE = 60;
    private static final int MINUTES_IN_HOUR = 60;
    private static final int HOURS_IN_DAY = 24;
    private static final int DAYS_IN_YEAR = 365; //I know this value is more like 365.24...
    private static final long MILLISECONDS_IN_YEAR = MILLIS_IN_SECOND * SECONDS_IN_MINUTE * MINUTES_IN_HOUR * HOURS_IN_DAY * DAYS_IN_YEAR;


System.out.println(MILLISECONDS_IN_YEAR);  //Returns 1471228928
Run Code Online (Sandbox Code Playgroud)

我知道1年大约是= 31,556,952,000毫秒,所以我的乘法不知何故.

谁能指出我做错了什么?我应该用多久?

rua*_*akh 32

我应该用多久?

是.问题是,因为MILLIS_IN_SECOND等等都是ints,当你乘以它们时,你会得到一个int.你是转换int到一个long,但只有int乘法已经导致了错误的答案.

要解决此问题,您可以将第一个转换为long:

    private static final long MILLISECONDS_IN_YEAR =
        (long)MILLIS_IN_SECOND * SECONDS_IN_MINUTE * MINUTES_IN_HOUR
        * HOURS_IN_DAY * DAYS_IN_YEAR;
Run Code Online (Sandbox Code Playgroud)

  • @kmb385:是的,确切地说.或者更确切地说 - 我认为cast*本身*只是将*first*`int`转换为`long`,但之后,Java会将每个`int`转换为`long`然后再乘以`long` `. (5认同)

Ode*_*ner 25

如果在Android上,我建议:

android.text.format.DateUtils

DateUtils.SECOND_IN_MILLIS
DateUtils.MINUTE_IN_MILLIS
DateUtils.HOUR_IN_MILLIS
DateUtils.DAY_IN_MILLIS
DateUtils.WEEK_IN_MILLIS
DateUtils.YEAR_IN_MILLIS
Run Code Online (Sandbox Code Playgroud)

  • 在"DateUtils.YEAR_IN_MILLIS"的类文档中,它说:"这个常数实际上是364天的长度,而不是一年!" (6认同)

Vit*_*nko 10

虽然其他人已经指出了算术溢出,但您也可以尝试使用TimeUnit来解决问题:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
int daysInYear = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(TimeUnit.DAYS.toMillis(daysInYear));
Run Code Online (Sandbox Code Playgroud)


Mat*_*Mat 8

private static final long MILLISECONDS_IN_YEAR = MILLIS_IN_SECOND * ...
Run Code Online (Sandbox Code Playgroud)

右边的所有操作数都是ints,所以乘法是用32位有符号整数完成的,它们会溢出.将第一个投射到long,你将获得预期的价值.

private static final long MILLISECONDS_IN_YEAR = (long)MILLIS_IN_SECOND * ...
Run Code Online (Sandbox Code Playgroud)


mil*_*ose 7

你的int类型很多.在Java中,两个ints 上的原始算术运算的结果是int.操作数的类型决定了这一点,而不是结果变量的类型.尝试:

private static final int MILLIS_IN_SECOND = 1000;
private static final int SECONDS_IN_MINUTE = 60;
private static final int MINUTES_IN_HOUR = 60;
private static final int HOURS_IN_DAY = 24;
private static final int DAYS_IN_YEAR = 365; //I know this value is more like 365.24...
private static final long MILLISECONDS_IN_YEAR = (long) MILLIS_IN_SECOND * SECONDS_IN_MINUTE * MINUTES_IN_HOUR * HOURS_IN_DAY * DAYS_IN_YEAR;
Run Code Online (Sandbox Code Playgroud)


use*_*300 5

你需要很长时间.Ints包裹着大约20亿.


小智 5

要解决此问题,您可以将字母L放在第一个之后:例如 1000L

long MILLS_IN_YEAR = 1000L * 60 * 60 * 24 * 365; // Returns 31536000000
Run Code Online (Sandbox Code Playgroud)