gpt4 book ai didi

java - 比较两个 Java 日历时如何标准化时区?

转载 作者:行者123 更新时间:2023-11-29 07:11:23 24 4
gpt4 key购买 nike

我对 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)
}

最佳答案

永远不要尝试使用 1000*60*60*24 来计算天数。这完全是错误的。如果您出于某种原因确实需要自己实现计算,请使用日历上的 YEAR 和 DAY_OF_YEAR 字段来计算实际天数的差异。

您不能简单地“覆盖”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
}

}

关于java - 比较两个 Java 日历时如何标准化时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com