转换2014年4月9日20:36:13 GMT到法国时区2014年4月9日21:36:13 CEST

时间:2014-04-10 05:18:07

标签: java android timezone

我需要将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());

请知道。

4 个答案:

答案 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没有附加时区。它只代表一个时间点。如果您在DateString之间转换,或者反之亦然,则时区才会发挥作用。

这意味着,您只需在阅读日期时使用绑定到GMT的格式(将其从String转换为Date),然后在转换时使用另一种绑定到法国的格式回到String