可能的解决方案: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);
答案 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)
我想提供现代的答案。并给你一个建议:不要复制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
。与过时的Date
,TimeZone
以及臭名昭着的DateFormat
和SimpleDateFormat
相比,它的使用效果要好得多。您的字符串符合ISO 8601标准,这是现代类解析为默认格式的格式,即没有任何明确的格式化程序。
当然,如果您需要,您可以使用与老式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
和/或查找其他资源。