gpt4 book ai didi

java - FullName Timezone 的时间不正确

转载 作者:行者123 更新时间:2023-11-30 08:36:08 25 4
gpt4 key购买 nike

我正在尝试使用全名时区将时间从时区转换为另一个时区。下面是我用过的java api。

    TimeZone.setDefault(TimeZone.getTimeZone("Africa/Algiers"));
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
String dateInString = "09:44:00";
TimeZone tzGMT01 = TimeZone.getTimeZone("Africa/Algiers");
formatter.setTimeZone(tzGMT01);

Date dateInAmerica = formatter.parse(dateInString);
String fromInput = formatter.format(dateInAmerica);
TimeZone tzGMT03 = TimeZone.getTimeZone("Asia/Bahrain");
formatter.setTimeZone(tzGMT03);

String toInput = formatter.format(dateInAmerica);
Time ts = java.sql.Time.valueOf(toInput);

09:44:00 的时间值转换为“亚洲/巴林”时间的预期输出为 11:44:00。但是输出是 13:44:00

有人可以指导上面的陈述中有什么问题吗?

最佳答案

您的问题是 Java Date 是完整的日期值,而不仅仅是时间值。当您不提供年/月/日值时,它们默认为 1970/01/01

1970 年的世界已经不一样了。Algiers正在使用 UTC+0 时区,并且 Bahrain以前使用的是 UTC+4,这与今天不同,阿尔及尔使用的是 UTC+1 时区,而巴林使用的是 UTC+3。

忽略日期也会导致采用夏令时的时区出现问题。

如您所见,日期很重要

这是显示它的代码:

TimeZone tzAlgiers = TimeZone.getTimeZone("Africa/Algiers");
TimeZone tzBahrain = TimeZone.getTimeZone("Asia/Bahrain");

SimpleDateFormat fmtTimeAlgiers = new SimpleDateFormat("HH:mm:ss");
fmtTimeAlgiers.setTimeZone(tzAlgiers);

SimpleDateFormat fmtDatetimeAlgiers = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
fmtDatetimeAlgiers.setTimeZone(tzAlgiers);

SimpleDateFormat fmtFullAlgiers = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z (Z)");
fmtFullAlgiers.setTimeZone(tzAlgiers);

SimpleDateFormat fmtFullBahrain = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z (Z)");
fmtFullBahrain.setTimeZone(tzBahrain);

Date date1970 = fmtTimeAlgiers.parse("09:44:00");
System.out.println(fmtTimeAlgiers.format(date1970) + " " + tzAlgiers.getID());
System.out.println(fmtFullAlgiers.format(date1970) + " " + tzAlgiers.getID());
System.out.println(fmtFullBahrain.format(date1970) + " " + tzBahrain.getID());
System.out.println();

Date date2016 = fmtDatetimeAlgiers.parse("2016-01-01 09:44:00");
System.out.println(fmtDatetimeAlgiers.format(date2016) + " " + tzAlgiers.getID());
System.out.println(fmtFullAlgiers.format(date2016) + " " + tzAlgiers.getID());
System.out.println(fmtFullBahrain.format(date2016) + " " + tzBahrain.getID());
System.out.println();

输出

09:44:00                          Africa/Algiers
1970-01-01 09:44:00 CET (+0000) Africa/Algiers
1970-01-01 13:44:00 AST (+0400) Asia/Bahrain

2016-01-01 09:44:00 Africa/Algiers
2016-01-01 09:44:00 CET (+0100) Africa/Algiers
2016-01-01 11:44:00 AST (+0300) Asia/Bahrain

1970 年的时区名称 CETAST 实际上是错误的。阿尔及尔使用的是 GMT,而巴林使用的是 GST(海湾标准时间)。

关于java - FullName Timezone 的时间不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37903428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com