我试图通过在给定的日期时间上添加分钟来计算时间。它适用于其他时间,但不适用于 DST 时间 [加拿大东部时间]。
public static GregorianCalendar addMinuts(GregorianCalendar newDate, int minutes) {
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(newDate.getTime());
Log.i("UtilApp", "expiry date before add minutes " + cal.getTime());
cal.add(Calendar.MINUTE, minutes);
Log.i("UtilApp", "expiry date after add " + minutes + " minutes " + cal.getTime());
return setGreCalendar(cal.getTime());
}
public static GregorianCalendar setGreCalendar(Date date) {
Date date1;
GregorianCalendar gregorianCalendar = new GregorianCalendar();
if (date != null) {
date1 = date;
gregorianCalendar.setTime(date1);
}
return gregorianCalendar;
}
例如:- 我在 3 月 9 日添加了 225 分钟,即 3 小时 45 分钟,它给出了确切的日期和时间,因为 DST 尚未生效。
3 月 10 日,DST 生效,所以我得到的不是 03:45,而是 04:45,同样的 225 分钟。由于 DST,日历会跳过 2:00 到 3:00 之间的时间。
我希望它忽略 DST 调整。我尝试使用时区、本地日期时间,但它没有按预期工作。任何帮助将不胜感激。
您(在问题中)写道:
我尝试使用时区、本地日期时间,但没有按预期工作。
我不知道您是否指的是类 LocalDateTime,因为如果您是指类,那么它应该按您的预期工作,因为类
LocalDateTime
没有时区,而类 Calendar
则具有其子类 GregorianCalendar
,继承。
无论夏令时调整如何,下面的代码都会在向
LocalDateTime
添加分钟时给出您的预期结果。
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class AdMinute {
public static void main(String[] args) {
LocalDate ld = LocalDate.of(2024, 3, 10);
LocalDateTime ldt = ld.atStartOfDay();
System.out.println("Org: " + ldt);
System.out.println("Add: " + ldt.plus(225, ChronoUnit.MINUTES));
}
}
这是运行上述代码时的输出:
Org: 2024-03-29T00:00
Add: 2024-03-29T03:45
请注意,我在以色列,我们的夏令时从 3 月 29 日开始。凌晨 2:00 时钟提前到凌晨 3:00。如果我将上面代码中的日期替换为 29(而不是 10),我仍然会得到相同的结果。因此,使用
LocalDateTime
不会 受到夏令时调整的影响。
请参阅此教程。