2

我见过几个这样的问题,但我不能完全正确地转换。我想转换如下日期

20121116203036Z

2012-11-16 15:30:36

我有以下代码

    dateStringTime.set( year, mon-1 , day, hour, minute, second );

    Date date = dateStringTime.getTime();

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    formatter.setTimeZone(TimeZone.getTimeZone("EST"));

    String output = formatter.format();
    return output;

哪个有效,但它给了我以下

2012-11-16 20:30:36

关于如何获得15而不是20的任何建议?

4

4 回答 4

2

首先,您的代码没有格式化“日期”,试试这个:

  String output = formatter.format(date);

我还注意到您没有向我们展示您是如何创建dateStringTime我认为是Calendar. 我注意到该Calendar.getInstance()方法还接受Locale可能影响时区的 a 。

我的代码:

    Calendar dateStringTime = Calendar.getInstance();

    //convert 20121116203036Z       
    int year = 2012;
    int mon = 11;
    int day = 16;
    int hour = 20;
    int minute = 30;
    int second = 36;

    dateStringTime.set( year, mon-1 , day, hour, minute, second );

    Date date = dateStringTime.getTime();

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    formatter.setTimeZone(TimeZone.getTimeZone("EST"));

    String output = formatter.format(date);
    System.out.println(output);     

我的输出:

2012-11-16 21:30:36

你注意到这个小时是 1 小时的休息时间?那是因为我在中央时区,当我要求“EST”时,JVM 会考虑到这一点。它认为原始时间在当前时区。

当您注释掉时会发生什么

        //formatter.setTimeZone(TimeZone.getTimeZone("EST"));
于 2013-02-15T19:18:02.207 回答
1

您的问题是您在错误的时区输入日期。当你这样做时

dateStringTime.set(year, month-1 , day, hour, minute, second);

您实际上是使用默认时区输入日期,在您的情况下这不太可能是 UTC。在幕后,JavaDate表示为 UTC,因此它将日期/时间转换为 UTC ,而不是直接输入 UTC。

基本上,它执行以下时区转换序列:EST -> UTC -> EST

如果您打算使用 UTC 指定日期/时间,您应该这样做:

dateStringTime.setTimeZone(TimeZone.getTimeZone("UTC"));
dateStringTime.set(year, month-1 , day, hour, minute, second);

然后你只会从 UTC -> EST 出发,你应该得到正确的输出。

于 2013-02-15T20:22:59.827 回答
1

时区。getDefault()将给出运行时时区。如果您从 中删除getRawOffetdate,您将获得 UTC。另一个步骤是从 UTC 添加/删除 EST 值并完成转换

于 2013-02-15T19:16:39.357 回答
1
于 2016-11-16T03:16:09.480 回答