我对11月7日感到愤怒.
我已经写了一个方法来计算两个Java Date对象之间的天数(在它被提到之前,JodaTime不是一个选项) - 该方法在大多数情况下工作,但是当白天开始xor结束日期时节省时间,产量减少一天.
压延机是否有某种方法可以覆盖日期的时区?我不关心日期实际上是什么时区,但它们必须是同一个!
代码如下:
public int getDayRange() {
//startDate = "Sat Nov 06 00:00:00 EDT 2010";
//endDate = "Sun Nov 07 23:59:59 EST 2010";
TimeZone tz = TimeZone.getTimeZone("UTC");
GregorianCalendar cal1 = new GregorianCalendar(tz);
GregorianCalendar cal2 = new GregorianCalendar(tz);
cal1.setTime(startDate);
cal2.setTime(endDate);
long ms1 = cal1.getTime().getTime();
long ms2 = cal2.getTime().getTime();
long difMs = ms2-ms1;
long msPerDay = 1000*60*60*24;
double days = difMs / msPerDay;
return (int) Math.floor(days)+1;
//returns 3(!!!) days (wrong)
}
Run Code Online (Sandbox Code Playgroud)
永远不要尝试使用1000*60*60*24作为一天.这是完全错的.如果您确实需要由于某种原因自己实施计算,请使用日历上的YEAR和DAY_OF_YEAR字段来计算实际天数的差异.
您不能简单地"覆盖"a的时区,java.util.Date因为它没有与之关联的时区信息.您需要知道要解释的时区,并在将其转换为人工表示时使用该时区.正如您所发现的,任意使用UTC来解释它将无法提供一致的结果!
public int getDayRange() {
//startDate = "Sat Nov 06 00:00:00 EDT 2010";
//endDate = "Sun Nov 07 23:59:59 EST 2010";
TimeZone tz1 = TimeZone.getTimeZone("EDT");
TimeZone tz2 = TimeZone.getTimeZone("EST");
GregorianCalendar cal1 = new GregorianCalendar(tz1);
GregorianCalendar cal2 = new GregorianCalendar(tz2);
cal1.setTime(startDate);
cal2.setTime(endDate);
if (cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)) {
return cal2.get(Calendar.DAY_OF_YEAR) - cal1.get(Calendar.DAY_OF_YEAR) + 1;
} else {
//this gets complicated, but you can see what to do, plenty of examples online
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1872 次 |
| 最近记录: |