2017-05-05 113 views
0

今天是5月5日。以下代码应输出4月11日和4月10日。相反,我得到4月11日和5月29日。下面是代码:错误的日期转换

int daysBack = 24; 
    long dayBeginningMilis = getTodaysBeginningMilis() - 86400000 * daysBack; 
    Log.i(TAG, "Date: " + new Date(dayBeginningMilis)); 

    daysBack = 25; 
    dayBeginningMilis = getTodaysBeginningMilis() - 86400000 * daysBack; 
    Log.i(TAG, "Date: " + new Date(dayBeginningMilis)); 

private long getTodaysBeginningMilis() { 

    // Get milis of todays beginning 
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.HOUR, 0); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 
    calendar.setTimeZone(TimeZone.getTimeZone("Europe/Kiev")); 

    return calendar.getTimeInMillis(); 

} 

输出:

Date: Tue Apr 11 00:00:00 EEST 2017 
Date: Mon May 29 17:02:47 EEST 2017 

这究竟是为什么?

回答

1

我找到了罪魁祸首。似乎乘法整数使它们超出界限,并且它们不会自动转换为长整型。此更改已解决问题:

long daysBack = 24L; 
long dayBeginningMilis = getTodaysBeginningMilis() - 86400000L * daysBack; 
Log.i(TAG, "Date: " + new Date(dayBeginningMilis)); 

daysBack = 25L; 
dayBeginningMilis = getTodaysBeginningMilis() - 86400000L * daysBack; 
Log.i(TAG, "Date: " + new Date(dayBeginningMilis));