将TZ格式的字符串转换为Date

可能的解决方案: 将Java Date转换为另一个Time as Date格式

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

我有一个字符串“ 2013-07-17T03:58:00.000Z ”,我想将它转换为我们在制作新Date()时获得的相同forms的日期。日期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); 

使用日历表示时区。

 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,因为它具有更好的function。 对于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(); 

日期没有任何时区。 如果你想知道日期的字符串表示是什么在印度时区,那么使用另一个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 

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。 使用它比过时的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 

链接到教程

阅读有关在Oracle教程中使用java.time和/或查找其他资源的更多信息。