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

时间:2013-07-17 06:41:02

标签: java date datetime simpledateformat

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

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

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

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

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

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

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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));

输出(当前时区是巴黎 - GMT + 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

答案 2 :(得分: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

链接到教程

详细了解如何在the Oracle tutorial中使用java.time和/或查找其他资源。