Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中转换日期时出错 发生了什么事: 开始时_Java_Android - Fatal编程技术网

在java中转换日期时出错 发生了什么事: 开始时

在java中转换日期时出错 发生了什么事: 开始时,java,android,Java,Android,date=2014-12-17T21:37:00+00:00 结尾处 needbydate=2014年12月18日 17更改为18。。。。我在转换中做错了什么 编辑: 您的日期格式使用系统默认时区。这对于您的输入没关系,因为它显式地指定了UTC偏移量-但是对于您的输出,您只得到了一个日期。因此,它向您显示该时间点在您的系统时区内发生的日期 您需要考虑您希望它是什么时区,以及它是否受到输入中非零偏移量的影响。您可以使用设置要在输出上使用的时区。(例如,2014-12-17T21:37:00-

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

  • 结尾处
needbydate
=2014年12月18日

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


编辑:
您的日期格式使用系统默认时区。这对于您的输入没关系,因为它显式地指定了UTC偏移量-但是对于您的输出,您只得到了一个日期。因此,它向您显示该时间点在您的系统时区内发生的日期

您需要考虑您希望它是什么时区,以及它是否受到输入中非零偏移量的影响。您可以使用设置要在输出上使用的时区。(例如,2014-12-17T21:37:00-05:00应显示为12月18日(UTC)还是12月17日(源时区)?)

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

在JonSkeet的帮助下解决了这个问题。。。完整的解决方案…在这里 乔达时间 事实上,这要容易得多。默认情况下,Joda Time处理标准ISO 8601格式字符串

当输入字符串包含偏移量时(本例中为
+00:00
),将相应地解析字符串的其余部分。当同时传递时区对象时,Joda time会将解析的值调整到该时区。有关演示,请参见下面的代码示例

请注意,加尔各答印度的调整意味着日期从17日滚动到18日

            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();
轻松调整到其他时区

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" ) );
跑步的时候

输入:2014-12-17T21:37:00+00:00
日期时间:2014-12-17T16:37:00.000-05:00
巴黎时间:2014-12-17T22:37:00.000+01:00
日期时间UTC:2014-12-17T21:37:00.000Z
日期时间加尔各答:2014-12-18T03:07:00.000+05:30

你能用
HH
代替
HH
吗?大写h表示24小时格式我将被罚款17次,但SDF上没有
Z
,因为这会导致无法解析的日期异常。感谢您的输入。。。。请参阅编辑。。。。这是你指的吗。。。我用了
jodaLibrary
来做这个。。。我怎样才能从任何资源中了解这些转换(我是这个概念的初学者)?@Devrath:不,我从来没有建议过搬到Joda时代,尽管那样通常会更好。现在还不清楚你为什么在这里使用一个特定的时区,或者我的建议有什么问题。如果您确实想使用Joda Time,最好使用
DateTimeFormatter
进行解析,而不是将字符串传递到构造函数中。哦。。。k如何使用
DateFormat.setTimeZone
任何示例。。。。我无法阅读文档并将其压印(这些概念的新手)@Devrath:您使用希望输出使用的时区来调用它。我不知道还有什么要说…@Devrath要了解Joda Time,只需在StackOverflow上搜索“Joda”。你会发现数以百计的实际例子。当您看到问题->解决方案而不仅仅是阅读JavaDoc时,学习起来就容易多了。为什么要在末尾串联一个空字符串?
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 );