我需要将2014年4月9日20:36:13 GMT转换为法国时区9 Apr 2014 21:36:13 CEST。
我遇到过这个功能但无法使其适应我的代码。
long ts = System.currentTimeMillis();
Date localTime = new Date(ts);
String format = "dd MMMM yyyy HH:mm";
SimpleDateFormat sdf = new SimpleDateFormat(format);
// Convert Local Time to UTC (Works Fine)
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Date gmtTime = new Date(sdf.format(localTime));
System.out.println("Local:" + localTime.toString() + "," + localTime.getTime() + " --> UTC time:"
+ gmtTime.toString() + "," + gmtTime.getTime());
// **** YOUR CODE **** END ****
// Convert UTC to Local Time
Date fromGmt = new Date(gmtTime.getTime() + TimeZone.getDefault().getOffset(localTime.getTime()));
System.out.println("UTC time:" + gmtTime.toString() + "," + gmtTime.getTime() + " --> Local:"
+ fromGmt.toString() + "-" + fromGmt.getTime());
请知道。
答案 0 :(得分:2)
answer by Meno Hochschild是正确的。
使用Joda-Time 2.3库可以更轻松地完成这项工作。
String input = "9 Apr 2014 20:36:13 GMT";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "d MMM yyyy HH:mm:ss z" ).withLocale( Locale.ENGLISH );
DateTimeZone timeZoneParis = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTime = formatter.withZone( timeZoneParis ).parseDateTime( input );
DateTime dateTimeUtc = dateTime.withZone( DateTimeZone.UTC );
String output = formatter.withZone( timeZoneParis ).print( dateTime );
转储到控制台...
System.out.println( "input: " + input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
跑步时......
input: 9 Apr 2014 20:36:13 GMT
dateTime: 2014-04-09T22:36:13.000+02:00
dateTimeUtc: 2014-04-09T20:36:13.000Z
output: 9 Apr 2014 22:36:13 CEST
答案 1 :(得分:1)
重写任务是将一个时间戳字符串转换为另一个字符串,以更改时区。您的代码尝试转换Date
- 与任务不一致的对象。
Date
- 对象没有内部时区,仅指每个规格的UTC时区。这个基本事实不受其使用默认时区的toString()
- 方法的奇怪且极其混乱的输出的影响。因此,尝试将Date
- 对象转换为另一个时区是无意义的(它仍然是UTC时区,状态可以通过其方法getTime()
观察到,它产生自1970-01-01T00以来经过的毫秒数:UTC时区00:00,000。)
关于您的输入“9 Apr 2014 20:36:13 GMT”,您需要:
// Use d, not dd for one or two day digits, use s for second, use z for timezone abbreviations
String format = "d MMM yyyy HH:mm:ss z";
// specify the locale and timezone for input, "Apr" sounds like English
SimpleDateFormat formatGMT = new SimpleDateFormat(format, Locale.ENGLISH);
formatGMT.setTimeZone(TimeZone.getTimeZone("GMT"));
// specify the locale and timezone for output, use a valid timezone identifier (IANA)
SimpleDateFormat formatFrance = new SimpleDateFormat(format, Locale.ENGLISH);
formatFrance.setTimeZone(TimeZone.getTimeZone("Europe/Paris"));
String input = "9 Apr 2014 20:36:13 GMT";
Date d = formatGMT.parse(input);
String output = formatFrance.format(d);
// the offset in April (summer time) is TWO hours, not one
System.out.println(output); // 9 Apr 2014 22:36:13 CEST
对于你真正想做日期算术的情况,比如在夏天减去一个小时,在冬天增加一个小时,你需要:
boolean summerTime = TimeZone.getTimeZone("Europe/Paris").inDaylightTime(d);
if (summerTime) {
d = new Date(d.getTime() - 3600 * 1000L);
} else {
d = new Date(d.getTime() + 3600 * 1000L);
}
String output = formatFrance.format(d);
In winter you get: 9 Mar 2014 22:36:13 CET (input was in March)
In summer you get: 9 Apr 2014 21:36:13 CEST
答案 2 :(得分:0)
试试这个..并告诉我它对你有用。
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd MMM yyyy HH:mm");
java.util.TimeZone timeZonecurr = java.util.TimeZone.getTimeZone("Etc/GMT");
java.util.TimeZone timeZoneto = java.util.TimeZone.getTimeZone("Etc/GMT+2");
sdf.setTimeZone(timeZonecurr);
java.util.Calendar calendar = new java.util.GregorianCalendar(timeZonecurr);
System.out.println("Current Time in Etc/GMT = " + sdf.format(calendar.getTime()));
calendar.setTimeZone(timeZoneto);
sdf.setTimeZone(timeZoneto);
System.out.println("Current Time in Etc/GMT+2 = " + sdf.format(calendar.getTime()));
答案 3 :(得分:0)
Java中的Date
没有附加时区。它只代表一个时间点。如果您在Date
和String
之间转换,或者反之亦然,则时区才会发挥作用。
这意味着,您只需在阅读日期时使用绑定到GMT的格式(将其从String
转换为Date
),然后在转换时使用另一种绑定到法国的格式回到String
。