返回给定日期的BST / GMT

时间:2014-11-11 15:07:46

标签: java datetime dst gmt

在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吗?

2 个答案:

答案 0 :(得分:3)

java.time

旧的日期时间 API(java.util 日期时间类型及其格式类型 SimpleDateFormat)已过时且容易出错。建议完全停止使用,改用java.timemodern 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.timeTrail: Date Time*


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow 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。