Java中的时区缩写

Java中的时区缩写,java,Java,我有一个Java对象的集合,从一个没有存储时区信息的旧数据库加载 我知道所有的日期(包括小时、分和秒)都是美国东部时区 我想为每个日期导出正确的时区缩写(“EST”或“EDT”) 下面是我的尝试(使用Java11)。至少可以说,这是很笨拙的 我研究了以下课程: java.util.TimeZone java.time.ZoneId java.time.zone.ZoneRules 这是我的方法——它使用两种说法,纯粹是为了给我一个战斗的机会,让我在一周后仍然理解我写的东西 编辑-根据@VGR下

我有一个Java对象的集合,从一个没有存储时区信息的旧数据库加载

我知道所有的日期(包括小时、分和秒)都是美国东部时区

我想为每个日期导出正确的时区缩写(“EST”或“EDT”)

下面是我的尝试(使用Java11)。至少可以说,这是很笨拙的

我研究了以下课程:

java.util.TimeZone
java.time.ZoneId
java.time.zone.ZoneRules
这是我的方法——它使用两种说法,纯粹是为了给我一个战斗的机会,让我在一周后仍然理解我写的东西

编辑-根据@VGR下面的评论,我更新了示例。现在它需要一个时区显示名称-例如
“America/New_York”

它是有效的(我有测试用例),但是有没有一种不那么冗长的方法?


(我没有找到任何以
日期
为起点的代码示例)。

类似以下内容

import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        System.out.println(TimeZone.getDefault().getDisplayName(TimeZone.getDefault().inDaylightTime(new Date()),TimeZone.SHORT));
    }
}

像下面这样的

import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        System.out.println(TimeZone.getDefault().getDisplayName(TimeZone.getDefault().inDaylightTime(new Date()),TimeZone.SHORT));
    }
}

我接受了Arvind的回答,因为他指出了时区。inDaylightTime()
——但作为记录,这里是我问题中方法的更新版本

现在更简洁了:

// tzName is a timezone display name, such as "America/New_York"

public static String getTimezoneAbbrev(Date date, String tzName) {
    TimeZone tz = TimeZone.getTimeZone(tzName);
    return tz.getDisplayName(tz.inDaylightTime(date), TimeZone.SHORT);        
}
警告 我还发现答案很有帮助-因为如果在使用timezone.getTimeZone()时键入一个不存在的时区显示名称(或ID),Java将返回“指定的时区,或GMT时区,如果给定的ID无法理解”(我的重点)

打字

美国/纽约

…而不是

美国/纽约

…足以引起问题

因此。。。
我们应该改用。这将为无效/未知ID引发一个错误。

我接受了Arvind的答案,因为他指出了时区。inDaylightTime()
——但作为记录,这里是我问题中方法的更新版本

现在更简洁了:

// tzName is a timezone display name, such as "America/New_York"

public static String getTimezoneAbbrev(Date date, String tzName) {
    TimeZone tz = TimeZone.getTimeZone(tzName);
    return tz.getDisplayName(tz.inDaylightTime(date), TimeZone.SHORT);        
}
警告 我还发现答案很有帮助-因为如果在使用timezone.getTimeZone()时键入一个不存在的时区显示名称(或ID),Java将返回“指定的时区,或GMT时区,如果给定的ID无法理解”(我的重点)

打字

美国/纽约

…而不是

美国/纽约

…足以引起问题

因此。。。
我们应该改用。这将为无效/未知ID引发错误。

第一行可以是
布尔值isDaylightSavings=TimeZone.getDefault().inDaylightTime(日期)
我对您在一行中使用
TimeZone.getTimeZone(“美国/纽约”)
和在下一行中使用
TimeZone.getDefault()
感到困惑。我原以为你想在任何地方都使用同一时区。甚至可能将其存储在一个静态的最终字段中?@VGR-是的,这令人困惑(即坏的和错误的)。我已经修复了我的示例-感谢您指出这一点。第一行可以是
boolean isDaylightSavings=TimeZone.getDefault().inDaylightTime(date)
我对您在一行中使用
TimeZone.getTimeZone(“美国/纽约”)
和在下一行中使用
TimeZone.getDefault()
感到困惑。我原以为你想在任何地方都使用同一时区。甚至可能将其存储在一个静态的最终字段中?@VGR-是的,这令人困惑(即坏的和错误的)。我已经修复了我的示例-感谢您指出这一点。Arvind(还有@Dawood):具有讽刺意味的是,我之所以使用
ZoneRules.isDaylightSavings()
,是因为我希望使用现代
java.time.zone
软件包。但是
TimeZone.inDaylightTime()
是我需要的,谢谢。我完全错过了。自Java1.1.Arvind(还有@Dawood)开始提供:具有讽刺意味的是,我之所以使用
ZoneRules.isDaylightSavings()
是为了使用现代
Java.time.zone
软件包。但是
TimeZone.inDaylightTime()
是我需要的,谢谢。我完全错过了。从Java1.1开始提供。