在java中转换日期时出错

时间:2014-12-17 11:13:39

标签: java android

String date = jsonobject.getString("needbydate");
DateFormat df = new SimpleDateFormat("MMM/dd/yyyy");
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZ");
Date startDate = sdf.parse(date);
String needbydate = df.format(startDate).toString()+"";

发生了什么::

  • 一开始

date = 2014-12-17T21:37:00+00:00

  • 最后

needbydate = 2014年12月18日

17更改为18 ....我在转换中做错了什么


编辑:

            String date=jsonobject.getString("needbydate");
            DateFormat df = new SimpleDateFormat("MMM/dd/yyyy",Locale.ENGLISH);
            DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss",Locale.ENGLISH);
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
            Date startDate;
            startDate = sdf.parse(date);
            needbydate = df.format(startDate).toString()+"";

3 个答案:

答案 0 :(得分:6)

您的日期格式使用的是系统默认时区。这对你的输入没问题,因为它明确指定了UTC偏移 - 但对于你的输出,你只是得到了一个日期。因此,它会显示您系统时区中该时间点的日期。

您需要考虑您想要的时区 - 以及是否受输入中非零偏移的影响。您可以使用DateFormat.setTimeZone设置输出时使用的时区。 (例如,2014-12-17T21:37:00-05:00应该显示为12月18日(UTC)还是12月17日(源时区)?)

您还应该使用输入格式中的HH而不是hh,因为它显然是24小时值,而不是12小时值。

答案 1 :(得分:1)

在JonSkeet的帮助下解决了这个......完整的解决方案......在这里

            String date=jsonobject.getString("needbydate");
            DateFormat df = new SimpleDateFormat("MMM/dd/yyyy",Locale.ENGLISH);
            df.setTimeZone(TimeZone.getTimeZone("UTC"));
            DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss",Locale.ENGLISH);
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
            Date startDate;
            startDate = sdf.parse(date);
            needbydate = df.format(startDate).toString();

答案 2 :(得分:1)

约达时间

Joda-Time确实容易得多。 Joda-Time默认处理标准ISO 8601格式字符串。

当输入字符串包含偏移量(在这种情况下为+00:00)时,相应地解析字符串的其余部分。当同时传递时区对象时,Joda-Time会将解析后的值调整为该区域。有关演示,请参阅下面的代码示例。

请注意加尔各答印度的调整意味着日期从17日到18日结束。

String input = "2014-12-17T21:37:00+00:00";

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeMontréal = new DateTime( input , zone ); // Parse as UTC because of "+00:00" offset, then adjust to desired time zone of Montréal.

轻松调整到其他时区。

DateTime dateTimeParis = dateTimeMontréal.withZone( DateTimeZone.forID( "Europe/Paris" ) );
DateTime dateTimeUtc = dateTimeMontréal.withZone( DateTimeZone.UTC );
DateTime dateTimeKolkata = dateTimeMontréal.withZone( DateTimeZone.forID( "Asia/Kolkata" ) );

转储到控制台。

System.out.println( "input: " + input );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeKolkata: " + dateTimeKolkata );

跑步时。

input: 2014-12-17T21:37:00+00:00
dateTimeMontréal: 2014-12-17T16:37:00.000-05:00
dateTimeParis: 2014-12-17T22:37:00.000+01:00
dateTimeUtc: 2014-12-17T21:37:00.000Z
dateTimeKolkata: 2014-12-18T03:07:00.000+05:30