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