我正在从GregorianCalendar 03/25/2018 09:41中减去24小时。
结果 03/24/2018 08:41
。
public class Utiles{
public static void main(String args[]) {
SimpleDateFormat sdt = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
GregorianCalendar gcFinAux = new GregorianCalendar(2018, 2, 25, 9, 41, 0);
System.out.println("1. " + sdt.format(gcFinAux.getTime()));
gcFinAux.add(Calendar.HOUR_OF_DAY, -24);
System.out.println("2. " + sdt.format(gcFinAux.getTime()));
}
}
输出
1. 25/03/2018 09:41:00
2. 24/03/2018 08:41:00
如果我尝试使用其他日期,结果是正确的。
我使用JDK1.6.0_45和Java 1.8在Linux和Windows中尝试。
有人可以确认您是否得到相同的结果?
谢谢。
答案 0 :(得分:0)
我知道世界上某些地方在特定的24小时内有时间变化。听起来基础逻辑就是考虑到这一点。
答案 1 :(得分:0)
正如评论中所说,你观察到的是今年3月24日至3月25日夜间夏季时间(DST)时间段的预期和正确行为。这包括欧洲大部分地区,包括西班牙,而不是(欧洲部分地区)土耳其和俄罗斯,但也包括格陵兰岛和黎巴嫩(巴拉圭在同一天晚上从夏季开始改变)。
java.time:正如词汇和Zabuza在评论中所说,你真的没有理由要使用SimpleDateFormat
和GregorianCalendar
。那些课程已经过时了,而前者尤其出了名的麻烦。而是使用java.time
,现代Java日期和时间API:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
ZonedDateTime zdtFinAux
= ZonedDateTime.of(2018, 3, 25, 9, 41, 0, 0, ZoneId.of("Europe/Madrid"));
System.out.println("1. " + zdtFinAux.format(formatter));
zdtFinAux = zdtFinAux.minusHours(24);
System.out.println("2. " + zdtFinAux.format(formatter));
输出与您的输出相同,当然:
1. 25/03/2018 09:41:00
2. 24/03/2018 08:41:00
如果您想要前一天的同一时间,则可以选择使用minusDays(1)
代替minusHours(24)
。
<强>链接强>
java.time
。