【问题标题】:Java TimeZone Conversion producing opposite results.Java 时区转换产生相反的结果。
【发布时间】:2016-01-12 20:53:41
【问题描述】:

这是我正在使用的示例。

import java.util.*;
import java.text.*;

public class TimeZoneTest
{

public static final String UTC_ZONE = "UTC";
static String utcDateString = "01/11/2016 11:00:00";

public static void main (String [] args)
{
    DateFormat df;

    try{

        df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        System.out.println("Original Date : " + utcDateString);
        df.setTimeZone(TimeZone.getTimeZone("UTC"));
        Date date = df.parse(utcDateString);
        System.out.println("     In its Date format : " + date.toString());
        System.out.println("     In its GMT format : " + date.toGMTString());
        System.out.println("     In its Local format : " + date.toLocaleString());
    }
    catch (ParseException ex)
    {
        System.out.println("Exception!!!!");
    }

}
}

这是产生的输出。

Original Date : 01/11/2016 11:00:00
     In its Date format : Mon Jan 11 06:00:00 EST 2016
     In its GMT format : 11 Jan 2016 11:00:00 GMT
     In its Local format : Jan 11, 2016 6:00:00 AM

当使用时间 11:00:00 并将 TimeZone 设置为 UTC 时,我期望作为本地时间(东部)表示的 11:00:00 然后将转换为 UTC,这将产生 16:00 :00。

相反,它似乎将字符串值 11:00:00 处理为 UTC 时间而不是本地时间,然后返回我的本地时间 06:00:00。

这是预期的结果吗? 设置时区时,是否应该将正在解析的时间 (11:00:00 ) 转换为该时区并生成 (16:00:00)? 或者 当您设置时区时,是否应该将正在解析的时间(11:00:00)视为在该时区并返回本地时间(06:00:00)?

【问题讨论】:

    标签: java timezone utc


    【解决方案1】:

    您的最后一句话是正确的:“或者当您设置时区时,是否应该将正在解析的时间 (11:00:00 ) 视为在该时区并返回本地时间 (06: 00:00)?”

    基本上,您在 DateFormat 中设置时区,然后解析没有时区信息的日期,因此它将使用 DateFormat 中的时区,将字符串转换为从 1970 年 1 月 1 日开始的一定毫秒数。然后,您使用“toString”打印该日期,该日期将使用您机器的时区将其转换回字符串。但是整个程序中的日期是相同的,只是格式/时区不同。

    【讨论】:

    • 部分混淆是使用 Date 对象和 SDF.format() 方法来生成 String 以及使用 String 和 SDF.parse() 方法。这两条路径产生不同的结果,但现在有意义。
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 2016-11-10
    • 1970-01-01
    • 2016-10-06
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    相关资源
    最近更新 更多