【发布时间】:2021-02-10 08:35:08
【问题描述】:
我想将 java.util.Date 对象设置为 java.util.Calendar 对象以更改 Date 对象的年份,如下所示:
TimezoneId 等于“Europe/Istanbul”。年份是 2018。
日期对象是 1969-12-31 22:00:00.0 (1969-12-31T22:00:00.000Z),zoneinfo 如下:
"sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]"
欧洲/伊斯坦布尔时区是 UTC+3,但是当我使用此日期对象运行代码时,新的 GregorianCalendar 将日期对象的时间更改为 -1 小时。出现问题,我找不到为什么不将 UTC 转换为 UTC+3 .Returned Date 对象等于 Sun Dec 31 21:00:00 UTC 2017.UTC-1 对于欧洲/伊斯坦布尔不正确。我该如何解决这个问题?
public static Date setYearOfDate(Date date, int year, String timeZoneId)
{
Calendar customCalendar = new GregorianCalendar(TimeZone.getTimeZone(timeZoneId));
customCalendar.setTime(date);
customCalendar.set(Calendar.YEAR, year);
return customCalendar.getTime();
}
注意:customCalendar zoneinfo 如下: "sun.util.calendar.ZoneInfo[id="Europe/Istanbul",offset=10800000,dstSavings=0,useDaylight=false,transitions=130,lastRule=null]"
【问题讨论】:
-
您使用的是哪个 Java 版本?
-
@RafaelGuillen 版本是 Java8
-
伊斯坦布尔现在可能在 UTC+3,但过去它要么在 UTC+2,要么在 UTC+2 和 UTC+3 之间交替进行夏令时.在 1969 年和 1970 年初,它是 UTC+2。见timeanddate.com/time/zone/turkey/…
-
我建议你不要使用
Date和Calendar。这些课程设计不佳且早已过时。如果您真的想要一个没有时间的日期,请使用java.time, the modern Java date and time API 中的LocalDate。如果要包含时间和时区,请使用同一 API 中的ZonedDateTime。 -
@MattJohnson-Pint 的评论暗示你得到的结果是正确的。
标签: java date timezone simpledateformat java-time