我正在尝试使用全名时区将时间从时区转换为另一个时区。下面是我用过的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
。
有人可以指导上述陈述中的错误。
答案 0 :(得分:2)
您的问题是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年,时区名称CET
和AST
实际上是错误的。阿尔及尔正在使用GMT
,巴林正在使用GST
(海湾标准时间)。
答案 1 :(得分:0)
它应该正常运行,I just did an example here使用您为亚洲/巴林提供的时区:
SimpleDateFormat f = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentTime = new Date();
System.out.println(f.format(currentTime.getTime()));
f.setTimeZone(TimeZone.getTimeZone("Asia/Bahrain"));
System.out.println(f.format(currentTime.getTime()));
SimpleDateForma将正确地完成这个技巧。
这是我的输出:
> 06/18/2016 23:55:13
> 06/19/2016 05:55:13