Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 将ISO8601 T-Z格式的字符串转换为日期_Java_Date_Datetime_Simpledateformat - Fatal编程技术网

Java 将ISO8601 T-Z格式的字符串转换为日期

Java 将ISO8601 T-Z格式的字符串转换为日期,java,date,datetime,simpledateformat,Java,Date,Datetime,Simpledateformat,可能的解决办法: 我看了一遍,但没有得到答案 我有一个字符串“2013-07-17T03:58:00.000Z”,我想把它转换成我们在创建新日期()时得到的相同形式的日期 时间应在IST区域-亚洲/加尔各答 因此,上面字符串的日期应为 2013年7月17日星期三12:05:16//根据印度标准GMT+0530,无论何时 String s="2013-07-17T03:58:00.000Z"; DateFormat formatter = new SimpleDateFormat("yyyy-MM

可能的解决办法:

我看了一遍,但没有得到答案

我有一个字符串“2013-07-17T03:58:00.000Z”,我想把它转换成我们在创建新日期()时得到的相同形式的日期

时间应在IST区域-亚洲/加尔各答

因此,上面字符串的日期应为

2013年7月17日星期三12:05:16//根据印度标准GMT+0530,无论何时

String s="2013-07-17T03:58:00.000Z";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
TimeZone tx=TimeZone.getTimeZone("Asia/Kolkata");
formatter.setTimeZone(tx);
d= (Date)formatter.parse(s);

约会没有任何时区。如果您想知道日期的字符串表示形式在印度时区中是什么,请使用另一个SimpleDataFormat,将其时区设置为印度标准,并使用此新SimpleDataFormat格式化日期

编辑:代码示例:

String s = "2013-07-17T03:58:00.000Z";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date d = formatter.parse(s);

System.out.println("Formatted Date in current time zone = " + formatter.format(d));

TimeZone tx=TimeZone.getTimeZone("Asia/Calcutta");
formatter.setTimeZone(tx);
System.out.println("Formatted date in IST = " + formatter.format(d));
输出(当前时区为巴黎-GMT+2):


对时区使用日历

TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta");
Calendar cal = Calendar.getInstance(tz);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
sdf.setCalendar(cal);
cal.setTime(sdf.parse("2013-07-17T03:58:00.000Z"));
Date date = cal.getTime();
不过,对于这一点,我建议使用它,因为它在这种情况下具有更好的功能。对于JodaTime,您可以执行以下操作:

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
DateTime dt = dtf.parseDateTime("2013-07-17T03:58:00.000Z");
Date date = dt.toDate();
java.time 我想提供一个现代的答案。并给您一个建议:与其复制
Date.toString()
将为您提供的内容,不如为相关区域设置中的用户使用内置格式:

    String isoString = "2013-07-17T03:58:00.000Z";
    String humanReadable = Instant.parse(isoString)
            .atZone(userTimeZone)
            .format(localizedFormatter);
    System.out.println(humanReadable);
在我的电脑上这张照片

17 July 2013 at 09.28.00 IST
我的代码片段使用了几个常量

private static final ZoneId userTimeZone = ZoneId.of("Asia/Kolkata");
private static final DateTimeFormatter localizedFormatter = DateTimeFormatter
        .ofLocalizedDateTime(FormatStyle.LONG)
        .withLocale(Locale.getDefault(Locale.Category.FORMAT));
当我们只传递默认格式的区域设置时,
withLocale
调用是多余的。我把它放进去,这样你就有一个地方可以提供一个明确的语言环境,如果你的用户需要一个不同的语言环境。它还有一个很好的优点,就是显式地表示结果取决于语言环境,以防阅读您的代码的人没有想到这一点

我使用的是
java.time
,现代java日期和时间API。它比过时的
日期
时区
和臭名昭著的
日期格式
简化格式
要好得多。您的字符串符合ISO 8601标准,现代类将该格式解析为其默认格式,也就是说,不使用任何显式格式化程序

和Date给你的格式一样 当然,如果您需要,您可以使用老式的
Date
格式。只需将上面的格式化程序替换为以下格式:

private static final DateTimeFormatter asUtilDateFormatter 
        = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
现在我们得到:

Wed Jul 17 09:28:00 IST 2013
链接到教程
阅读更多关于在中使用
java.time
和/或查找其他资源的信息。

Hii..我已经编辑了我的代码..但是它说无法解析字符串。SimpleDataFormat字符串应该是
“yyyy-MM-dd'T'HH:MM:ss.SSS'Z”
否则会得到java.lang.IllegalArgumentException:未知模式字符“X”@VijayC,这取决于您的java版本
Z
表示偏移量为零或“Zulu时区”,所以您应该更愿意确保对其进行解析。它是否重新运行日期对象?编辑后,最后一行将返回日期。但是请注意,日期没有时区。但是joda Time jar文件很重。包含它只是为了转换一次日期是有意义的?这就是为什么我还包含了一些使用日历的内容,以防您不想使用joda Time?经过长时间的搜索,我发现这是唯一可行的解决方案。谢谢@MarkM
Wed Jul 17 09:28:00 IST 2013