可能的解决方案: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);
使用日历表示时区。
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();
日期没有任何时区。如果你想知道日期的字符串表示是什么在印度时区,那么使用另一个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
我想提供现代的答案。并给你一个建议:不要重现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
阅读更多关于在java.time
中使用the Oracle tutorial和/或找到其他资源的信息。