在Java中,确定特定区域设置的任何给定Date对象的夏令时的可接受方法是什么。
例如,如果您有两个日期对象
Date date = new Date("01/01/2014");
Date date2 = new Date("01/07/2014");
该地区是"欧洲/伦敦",' date'应返回GMT,date2应返回" BST"
String timeZone = new String("Europe/London");
TimeZone tz = TimeZone.getTimeZone(timeZone);
System.out.println(tz.getDisplayName(tz.inDaylightTime(date),
TimeZone.SHORT));
TimeZone tz2 = TimeZone.getTimeZone(timeZone);
System.out.println(tz2.getDisplayName(tz2.inDaylightTime(date2),
TimeZone.SHORT));
这两个例子都打印GMT,不应该是第二次打印BST吗?
答案 0 :(得分:3)
旧的日期时间 API(java.util
日期时间类型及其格式类型 SimpleDateFormat
)已过时且容易出错。建议完全停止使用,改用java.time
,modern date-time API*。
语言环境是“欧洲/伦敦”,'date' 应该返回 GMT 和 date2 应该返回“BST”
请注意,Europe/London
是时区 (ZoneId
),而不是 Locale
。 Java SE 8 日期时间 API (java.time
) 为我们提供了 ZonedDateTime
,它根据 DST 转换自动调整时区偏移。
演示:
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("d/M/u", Locale.ENGLISH);
LocalDate date = LocalDate.parse("01/01/2014", dtfInput);
LocalDate date2 = LocalDate.parse("01/07/2014", dtfInput);
ZoneId zoneId = ZoneId.of("Europe/London");
ZonedDateTime zdt = date.atStartOfDay(zoneId);
ZonedDateTime zdt2 = date2.atStartOfDay(zoneId);
DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("dd/MM/uuuu'['z']'", Locale.ENGLISH);
System.out.println(zdt.format(dtfOutput));
System.out.println(zdt2.format(dtfOutput));
}
}
输出:
01/01/2014[GMT]
01/07/2014[BST]
从 modern date-time API 中详细了解 java.time
,Trail: Date Time*。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
答案 1 :(得分:2)
我认为您的日期不是夏令时,模式是mm / dd / yyyy,所以您的日期是2014年1月1日和2014年7月7日。 顺便说一句:您使用的构造函数已弃用!
Date date = new Date("01/01/2014");
Date date2 = new Date("01/07/2014");
Date date3 = new Date("07/07/2014");
Calendar cal = Calendar.getInstance(Locale.UK);
cal.setTime(date);
System.out.println(date + " " + cal.getTimeZone().inDaylightTime(date));
cal.setTime(date2);
System.out.println(date2 + " " + cal.getTimeZone().inDaylightTime(date2));
cal.setTime(date3);
System.out.println(date3 + " " + cal.getTimeZone().inDaylightTime(date3));
这应该给你一个提示。至少你知道日期是否在夏令时,如何调用这个时间是第二个问题,我不认为它可以通过标准API解决。你试过看http://www.joda.org/joda-time/吗?它是DateTime计算的API。