17

可能的解决方案:将 Java 日期转换为另一种时间作为日期格式

我经历了它,但没有得到我的答案。

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

时间应该在 IST 区 - 亚洲/加尔各答

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

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

3 回答 3

25

使用日历作为时区。

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();
于 2013-07-17T06:54:43.503 回答
4

日期没有任何时区。如果您想知道印度时区中日期的字符串表示形式,则使用另一个 SimpleDateFormat,其时区设置为印度标准,并使用这个新的 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
于 2013-07-17T06:44:32.390 回答
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.time现代 Java 日期和时间 API。它比过时的DateTimeZone臭名昭著的麻烦DateFormatSimpleDateFormat. 您的字符串符合 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.timeOracle 教程中阅读有关使用的更多信息和/或查找其他资源。

于 2018-01-31T11:00:57.223 回答