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)));