我正在使用毫秒进行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)
Ode*_*ner 25
如果在Android上,我建议:
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)
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)
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)
你的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)
小智 5
要解决此问题,您可以将字母L放在第一个之后:例如 1000L
long MILLS_IN_YEAR = 1000L * 60 * 60 * 24 * 365; // Returns 31536000000
Run Code Online (Sandbox Code Playgroud)