Java 一个国家的时区,日间储蓄是否有效

Java 一个国家的时区,日间储蓄是否有效,java,time,timezone,dst,Java,Time,Timezone,Dst,考虑以下代码: if(strTimeZoneCd.equals("A")) locTz = TimeZone.getTimeZone("AST"); else if(strTimeZoneCd.equals("M")) locTz = TimeZone.getTimeZone("MST"); else if(strTimeZoneCd.equals("P")) locTz = TimeZone

考虑以下代码:

if(strTimeZoneCd.equals("A"))
            locTz = TimeZone.getTimeZone("AST");
        else if(strTimeZoneCd.equals("M"))
            locTz = TimeZone.getTimeZone("MST");
        else if(strTimeZoneCd.equals("P"))
            locTz = TimeZone.getTimeZone("PST");
        else if(strTimeZoneCd.equals("H"))
            locTz = TimeZone.getTimeZone("HST");
        else if(strTimeZoneCd.equals("C"))
            locTz = TimeZone.getTimeZone("CST");
        else if(strTimeZoneCd.equals("E"))
            locTz = TimeZone.getTimeZone("EST");
        else if(strTimeZoneCd.equals("G"))
            locTz = TimeZone.getTimeZone("GMT");
        else if(strTimeZoneCd.equals("Y"))
            locTz = TimeZone.getTimeZone("AKST");
如果我在这里传递
A
,它将给我
AST
。但我需要确定是返回
AST
还是
ADT

我需要确定
AST
现在是否处于夏令时模式。如果是夏令时,我可以返回
ADT
,如果不是,我可以返回
AST
。但我不知道如何确定时区是否处于夏令时

有人能帮我吗?

解决这个问题:

适用于任何特定时区

TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());

您可以使用此程序确定该时区是否处于日光节约状态

另请参见此链接


首先,避免使用时区名称的简短缩写(如
CST
PST
CEST
),因为它们是

例如,
CST
用于:它可以是“”,也可以是“”。而且每一个都有不同的关于Dayligh节省时间的规则,所以使用缩写可能不一定能得到你期望的结果

TimeZone
类假定这些短名称有一些默认值(所有的默认值都是任意选择的),并且还具有

为了避免这些歧义,最好使用(始终采用
地区/城市
格式,如
亚洲/加尔各答
美国/纽约

通过调用
TimeZone.getAvailableIDs()
,您可以获得可用时区的列表(并选择最适合您的系统的时区)

然后您可以使用
inDaylightTime()
方法,如其他答案中所述

另一种选择是使用格式化程序,因为它会自动检查是否在夏令时,并打印区域短名称。我还使用
java.util.Locale
来指示名称应该是英文的(我不确定不同的语言是否会影响短区名称,这是一种“以防万一”的方法):

上面的代码打印的是美国东部夏令时(因为今天,2017年9月13日,纽约正处于夏令时,而且

在这种情况下,您可以创建格式化程序,并使用
if
逻辑在其中设置正确的时区。然后,格式化程序负责检查日期是否在夏令时,并返回正确的缩写


Java新的日期/时间API 旧类(
Date
Calendar
SimpleDateFormat
)具有和,它们正在被新的API所取代

如果使用<强> java 8 < />,请考虑使用这更容易


如果您正在使用Java,请遵循以下讨论。这可能会对您有所帮助。这不会直接回答您的问题,而且您可能无法更改映射的单数字母缩写。但是,在处理时间时,有时最好保留时间适用的位置(因此夏令时“自动”应用)而不是区域。例如,与“CET”或“CEST”不同,您只需设置“Europe/Paris”(如果实体代表巴黎),夏令时问题就简单地消除了。如前所述,三个字母和四个字母的时区缩写通常模棱两可。AST可能很简单(也许你的代码已经给了你想要的东西)。MST已经糟糕多了,因为什么时候你会想要MDT呢?如果你在亚利桑那州,除了纳瓦霍民族或克雷斯顿BC,答案永远不会是因为这些地方和其他地方全年都在使用MST。如果在阿尔伯塔省、科罗拉多州或南下加利福尼亚州,你有时会想要MDT。简而言之,你提出了不可能的要求。顺便说一句,我建议你停止使用过时的
时区类及其朋友。现代的Java日期和时间API非常好用。它对应的类是
ZoneId
。可能,只是可能您需要这些伪时区:PST8PDT、EST5EDT、MST7MDT、CST6CDT。对于AST,我相信你可以使用美国/安克雷奇。对于HST,我一点也不确定,但是你可以考虑太平洋/火奴鲁鲁或美国/阿留申群岛,注意这两个区域是不同的!我相信这两行将始终打印
false
。EST转换为
GMT-05:00
,因此这两个“时区”都不遵守夏令时(DST)。是的,您需要提供具有夏时制的时区。嘿,区域名称的自定义地图非常好地使用了
方法的两个参数
ZoneId。聪明的想法。谢谢!事实上,我终于找到了它的一个很好的用途(从未在生产代码中使用过)。
import java.util.Date;
import java.util.TimeZone;

public class test {

    public static void main(String[] args) {
        System.out.println(TimeZone.getTimeZone("EST").inDaylightTime( new Date() ));
        System.out.println(TimeZone.getTimeZone( "GMT-9:00").inDaylightTime( new Date() ));
    }
}
// formatter with `z` (zone short name)
SimpleDateFormat sdf = new SimpleDateFormat("z", Locale.ENGLISH);
// set timezone in the formatter
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
// prints the zone name for the current date
System.out.println(sdf.format(new Date()));
// create formatter for short zone name and English locale
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("z", Locale.ENGLISH);
// format current date in New York timezone
System.out.println(fmt.format(ZonedDateTime.now(ZoneId.of("America/New_York"))));
// create custom map of zone names
Map<String, String> customZones = new HashMap<>();
// map "E" to New York
customZones.put("E", "America/New_York");
// map "G" to GMT
customZones.put("G", "GMT");
...

// create timezone using the custom map ("E" will create "America/New_York" zone)
ZoneId zone = ZoneId.of("E", customZones);
// format current date in specified timezone
System.out.println(fmt.format(ZonedDateTime.now(zone)));