将T-Z格式的字符串转换为Date

问题描述 投票:15回答:3

可能的解决方案:Convert Java Date into another Time as Date format

我经历过但没有得到答案。

我有一个字符串“2013-07-17T03:58:00.000Z”,我想将它转换为我们在制作新Date()时获得的相同形式的日期。日期d =新Date();

时间应该在IST.Zone-Asia / Kolkata

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

7月17日星期三12:05:16 IST 2013 //无论什么时间按照印度标准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);
java date datetime simpledateformat
3个回答
22
投票

使用日历表示时区。

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();

对于这一点,我建议Joda Time,因为它有更好的功能,适用于这种情况。对于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();

4
投票

日期没有任何时区。如果你想知道日期的字符串表示是什么在印度时区,那么使用另一个SimpleDateFormat,其时区设置为Indian Standard,并使用这个新的SimpleDateFormat格式化日期。

编辑:代码示例:

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));

输出(当前时区是巴黎 - 格林威治标准时间+2):

Formatted Date in current time zone = 2013-07-17T05:58:00.000+02
Formatted date in IST = 2013-07-17T09:28:00.000+05

0
投票

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日期和时间API的java.time。与过时的DateTimeZone以及臭名昭着的麻烦的DateFormatSimpleDateFormat相比,它更好。您的字符串符合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中使用the Oracle tutorial和/或找到其他资源的信息。

© www.soinside.com 2019 - 2024. All rights reserved.