代码之家  ›  专栏  ›  技术社区  ›  Mavrik

用SimpleDateFormat解析奇怪的日期和时间结果

  •  5
  • Mavrik  · 技术社区  · 15 年前

    我在用SimpleDateFormat解析ISO8601日期和时间时遇到了一个奇怪的问题。相关代码为:

    public class DateHelper
    {
        private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        public static Date parseISO8601(String date) throws ParseException
        {
            Date result = iso8601formatter.parse(date);
            return result;
        }
    }
    

    作为输入,我给它一个字符串

    2010-09-06T15:30:00+02:00
    

    作为返回,我得到一个日期对象,日期设置为2010年1月6日,时间为13:30,时区为GMT+00:00。

    令人困惑的是,日期设置部分正确,只是月份设置错误。

    这个问题显示在Android 1.6和Android 2.2上。

    5 回复  |  直到 9 年前
        1
  •  6
  •   BalusC    15 年前

    如果你使用 mm MM .

    所以我怀疑问题的原因是存在的,你没有运行你认为你在运行的代码版本。重新编译并重新执行问题中的代码。没错。

        2
  •  2
  •   cherouvim    15 年前

    可能不是你的问题,但是自从 SimpleDateFormat is not thread safe 您需要将代码更改为:

    public class DateHelper
    {
        public static Date parseISO8601(String date) throws ParseException
        {
            return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(date);
        }
    }
    
        3
  •  2
  •   user85421    15 年前


    不确定Android,但是对于Java 6输入字符串 2010-09-06T15:30:00+02:00 无效。

    +02:00
    不带冒号试试:

        2010-09-06T15:30:00+0200  
    

    戏法

        System.out.println(iso8601formatter.format(new Date()));  
    
        4
  •  1
  •   Kenny Wyland    15 年前

    我创建了一个1.6项目,代码为我工作。。。

    public class DateHelper {
        private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

    public static Date parseISO8601(String date) throws ParseException {
        Date result = iso8601formatter.parse(date);
        return result;
    }
    
    public static String makeISO8601String(Date date) {
        return iso8601formatter.format(date);
    }
    

    }

    public class StackOverflowTest extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

        TextView textView = (TextView)this.findViewById(R.id.textView);
    
        StringBuilder builder = new StringBuilder();
        try {
            String badDateString = "2010-09-06T15:30:00+0200";
            Date parsedDate = DateHelper.parseISO8601(badDateString);
            builder.append(badDateString).append("\n");
            builder.append(parsedDate.toString()).append("\n");
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String dateString = DateHelper.makeISO8601String(new Date());
        builder.append("now="+dateString).append("\n");
    
        textView.setText(builder.toString());
    }
    

    对我来说它印出来了:

    2010-09-06T15:30:00+0200
    Mon Sep 06 06:30:00 PDT 2010
    now=2010-11-06T14:41:55-077

    这对我来说是正确的。。。

        5
  •  0
  •   DArkO    15 年前

    public static Date parseDateFromString(String aDateString){
        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
        Date date=null;
        try {
            date= inputFormat.parse(aDateString);
        } catch (ParseException e) {
            return null;
        }
        return date;
    

    当分析时区时,比如+02:00,它是用z而不是z。希望它能帮上忙。我认为给你+00:00的问题与你使用的语言环境有关。你应该试着用不同的语言环境来测试它。