【问题标题】:android / java se SimpleDateFormat TimeZone issueandroid / java se SimpleDateFormat TimeZone 问题
【发布时间】:2011-05-27 15:05:23
【问题描述】:

我在 android 2.1 上运行的程序中遇到了一个奇怪的问题,这对我来说似乎是 android 中的一个错误。请告诉我这里发生了什么,因为我迷路了。 :)

以下程序:

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

class TestMe {
    public static void main(String[] args) {
            String time = "2010-08-01T18:00:00+0000";

            TimeZone tg = TimeZone.getDefault();
            System.out.println(tg.getID());

            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

            try {
                Date indate = formatter.parse(time);

                String outdate = formatter.format(indate);
                System.out.println(outdate);

                formatter.setTimeZone( TimeZone.getTimeZone("UTC"));

                String ooutdate = formatter.format(indate);
                    System.out.println(ooutdate);

                formatter.setTimeZone( TimeZone.getDefault() );
                Date ioutdate = formatter.parse(ooutdate);
                System.out.println(formatter.format(ioutdate));

                } catch( Exception e ) {
                    e.printStackTrace();
            }
        }
        }

在 mac 上使用最新的 java se 时返回:

(~) % javac -g TestMe.java && java TestMe                                                                                                                                                                                                              
Europe/Berlin
2010-08-01T20:00:00+0200
2010-08-01T18:00:00+0000
2010-08-01T20:00:00+0200

但是当我在 2.1 上的 android 应用程序的方法中运行它时返回以下内容:

I/System.out( 5379): ------------------------------------------------------------------
I/System.out( 5379): Europe/Berlin
I/System.out( 5379): 2010-08-01T20:00:00+0200
I/System.out( 5379): 2010-08-01T18:00:00+0100
I/System.out( 5379): 2010-08-01T18:00:00+0100
I/System.out( 5379): ------------------------------------------------------------------

有人知道这个特定的 android api 版本中存在 TimeZone 和 Date 解析的问题吗?这对我来说是一个非常奇怪的问题,因为它的 android 版本应该返回与 java se 版本完全相同但没有。

感谢任何提示,

卡斯滕

【问题讨论】:

    标签: android date timezone


    【解决方案1】:

    尝试将setTimeZone("UTC") 替换为setTimeZone("GMT"),这可能是不同的实现,因为现在BST(英国夏令时)tz 中的0 子午线是GMT+1。

    【讨论】:

    • 感谢您的建议!我试过了,但不幸的是,结果和以前一样:/
    【解决方案2】:

    是的,我试过了,结果和你一样。我猜那是一个错误。

    http://code.google.com/p/android/issues/detail?id=8258 可能会帮助你

    【讨论】:

      【解决方案3】:

      我已经在 windows java 和 android2.3 中测试过。在这两种情况下,我都得到了相同的结果。我认为这个错误在 android 2.3 中不再存在。反正 请检查 android 和 java 的导入语句

      android 中的导入语句

      import java.text.SimpleDateFormat;
      import java.util.Date;
      import java.util.TimeZone;
      
      import android.app.Activity;
      import android.os.Bundle;
      import android.widget.Button;
      import android.widget.TextView;
      

      java中的import语句

      import java.text.SimpleDateFormat;
      import java.util.Date;
      import java.util.TimeZone;
      

      谢谢 迪帕克

      【讨论】:

      • 是的,我正在使用这些导入语句。感谢您的回复!
      【解决方案4】:

      我设法使用 Calendar 对象完成了预期的日期转换:

              try{ 
              String time = "2010-08-01T18:00:00+0000";
      
              SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
              Date indate = formatter.parse(time);
      
              Calendar cal = Calendar.getInstance();
              System.out.println("time right now: " + cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH) + "T" + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + "Z");
      
              cal.setTime( indate );
      
              System.out.println("time from date string: " + cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH) + "T" + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + "Z");
      
              Calendar utcCal = new GregorianCalendar( TimeZone.getTimeZone("UTC"));
              utcCal.setTimeInMillis( cal.getTimeInMillis() );
      
              System.out.println("time from date string in utc: " + utcCal.get(Calendar.YEAR) + "-" + (utcCal.get(Calendar.MONTH) + 1) + "-" + utcCal.get(Calendar.DAY_OF_MONTH) + "T" + utcCal.get(Calendar.HOUR_OF_DAY) + ":" + utcCal.get(Calendar.MINUTE) + ":" + utcCal.get(Calendar.SECOND) + "Z");
      
          } catch( Exception e) {
      
          }
      

      【讨论】:

        【解决方案5】:

        尝试在每次调用 setTimeZone() / format() 之前重新创建您的 SimpleDateFormat 对象。

        这解决了我在使用通用 SimpleDateFormat 对象格式化一组跨越 DST 更改的时间时遇到的问题。如果集合中的第一个时间在 DST 阈值之后,则集合中的所有时间格式都正确。如果集合中的第一次是在 DST 阈值之前,那么 DST 阈值之后的所有时间都被错误地格式化(即一个小时后) - 即使我在每次 format() 调用之前尝试调用 setTimeZone() 时,这种情况也会继续。

        我由此推断出 SimpleDateFormat 对象使用的时区与第一个 format() 调用相关联,随后对 setTimeZone() 的调用被有效地忽略或覆盖(这听起来像是 Java 问题,而不是 Android 问题)。

        【讨论】:

          猜你喜欢
          • 2011-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-28
          • 1970-01-01
          • 2014-02-03
          • 1970-01-01
          相关资源
          最近更新 更多