java - 通过 SimpleDateFormat 解析时间字符串得到错误的日期。 (偏移 1 小时)[Android/Java]

标签 java android timezone locale simpledateformat

首先,我想澄清,这不是夏令时问题。

其次,经过努力,似乎与SimpleDateFormat中使用的语言环境有关。

第三,它似乎只发生在 PST/PDT 时区。 UTC 没问题。

<小时/>

这是测试代码。

使用美国和英语区域设置来解析相同的日期。

    try {
        Date date = new Date();
        SimpleDateFormat US_format = new SimpleDateFormat("MMM d HH:mm:ss z", Locale.US);
        SimpleDateFormat EN_format = new SimpleDateFormat("MMM d HH:mm:ss z", Locale.ENGLISH);

        US_format.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); //Set PST Timezone
        String US_str =  US_format.format(date);
        Log.i("DEBUG", "US_str: " + US_str);
        Log.i("DEBUG", "US_str: " + US_format.format(US_format.parse(US_str)));

        EN_format.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); //Set PST Timezone
        String EN_str =  EN_format.format(date);
        Log.i("DEBUG", "EN_str: " + EN_str);
        Log.i("DEBUG", "EN_str: " + EN_format.format(EN_format.parse(EN_str)));
    } catch (ParseException e) {
        Log.i("DEBUG", "Parsing Error");
    }

结果是

02-26 19:42:42.863 I/DEBUG﹕ US_str: Feb 26 19:42:42 PST

02-26 19:42:42.865 I/DEBUG﹕ US_str: Feb 26 18:42:42 PST

02-26 19:42:42.865 I/DEBUG﹕ EN_str: Feb 26 19:42:42 PST

02-26 19:42:42.866 I/DEBUG﹕ EN_str: Feb 26 19:42:42 PST

这是一个错误吗? 为什么 Locate.US 存在一小时的差异?

======================================

更新: 这似乎只发生在 Android 5.0 设备上。 其他环境似乎还可以。

在 Android 问题跟踪器上发布了一个错误。 (问题158265)

最佳答案

我认为错误可能来自 Logger。它与区域设置无关。

    Date date = new Date();
    SimpleDateFormat US_format = new SimpleDateFormat("MMM d HH:mm:ss z", Locale.US);
    SimpleDateFormat EN_format = new SimpleDateFormat("MMM d HH:mm:ss z", Locale.ENGLISH);

    String US_str =  US_format.format(date);
    System.out.println( "US_str: " + US_str);
    System.out.println( "US_str: " + US_format.format(US_format.parse(US_str)));

    String EN_str =  EN_format.format(date);
    System.out.println( "EN_str: " + EN_str);
    System.out.println( "EN_str: " + EN_format.format(EN_format.parse(EN_str)));

这是在我的电脑上获得的输出:

US_str:2 月 27 日 12:18:26 国际标准时间

US_str:2 月 27 日 12:18:26 国际标准时间

EN_str:2 月 27 日 12:18:26 国际标准时间

EN_str:2 月 27 日 12:18:26 国际标准时间

希望这对你有帮助。

关于java - 通过 SimpleDateFormat 解析时间字符串得到错误的日期。 (偏移 1 小时)[Android/Java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28757288/

相关文章:

java - 如何在thymeleaf中添加其他html文件,可以吗?

Android:对话框内的ListView中的项目单击监听器

android - 如何使用 DPAD 在 Android 5 上浏览操作菜单项

android - Android 服务器时区的 JWT setExpiration

java - Java夏令时的问题

java - 以编程方式配置 DropWizard

java - 使用 iText 生成波斯语 PDF

java - 用 java 函数转置 double[][] 矩阵?

android - 托管在 https 协议(protocol) Web 应用程序上的移动应用程序的 REST API 会很慢吗?

javascript - 如何猜测时间戳的时区?