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