格式化日期字符串java

时间:2014-10-31 10:44:30

标签: datetime-format timezone-offset

我有一个日期字符串,如下所示: - Fri Oct 31 11:30:58 GMT+05:30 2014 我想将它转换为2014-10-31T6:00:00,这应该是在添加偏移量之后。我该怎么办?

3 个答案:

答案 0 :(得分:1)

我建议您使用 modern date-time API* 执行以下步骤:

  1. 由于给定的日期时间字符串具有时区偏移值 (+05:30),请使用使用适用模式创建的 OffsetDateTime 对象将其解析为 DateTimeFormatter 对象。
  2. 将获得的 OffsetDateTime 对象转换为带有 OffsetDateTimeZoneOffset.UTC 对象,确保结果在同一时刻。您可以使用 OffsetDateTime#withOffsetSameInstant 来完成。
  3. OffsetDateTime#toString 的默认实现会省略秒和秒的分数(如果它们为零)。您可以使用使用适用模式创建的 OffsetDateTime 对象格式化在上一步中获得的 DateTimeFormatter 对象。
  4. 您的预期输出还表明您想要忽略秒部分。如果是,您可以使用 OffsetDateTime#truncatedTo

演示:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "Fri Oct 31 11:30:58 GMT+05:30 2014";

        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("E MMM d H:m:s O u", Locale.ENGLISH);

        OffsetDateTime odt = OffsetDateTime.parse(strDateTime, dtfInput);

        OffsetDateTime odtUtc = odt.withOffsetSameInstant(ZoneOffset.UTC);

        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss", Locale.ENGLISH);
        String output = odtUtc.format(dtfOutput);
        System.out.println(output);

        // In case you want to ignore the seconds
        OffsetDateTime odtUtcTruncated = odtUtc.truncatedTo(ChronoUnit.MINUTES);
        output = odtUtcTruncated.format(dtfOutput);
        System.out.println(output);
    }
}

输出:

2014-10-31T06:00:58
2014-10-31T06:00:00

modern date-time API 中了解有关 Trail: Date Time* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 1 :(得分:0)

这应该可以完成任务,我想。

public static void main(String args[]) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    format.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println(format.format(new Date()));  
}

答案 2 :(得分:0)

首先,您需要一个SimpleDateFormat,其模式与您的输入字符串匹配:"EEE MMM dd HH:mm:ss z yyyy"。看看:SimpleDateFromat API

    SimpleDateFormat in = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");

然后您可以解析输入String以获取相应的Date对象,如下所示:

    Date date = in.parse("Fri Oct 31 11:30:58 GMT+05:30 2014");

请注意,Date对象没有时区作为其状态的一部分。如果您想以UTC格式打印日期,则需要另一个SimpleDateFormat格式化并在您所需的时区打印日期。

    SimpleDateFormat out = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    out.setTimeZone(TimeZone.getTimeZone("UTC"));
    out.format(date);   

示例:http://ideone.com/Wojec3

public static void main (String[] args) throws java.lang.Exception
{
    SimpleDateFormat in = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
    SimpleDateFormat out = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    out.setTimeZone(TimeZone.getTimeZone("UTC"));

    Date date = in.parse("Fri Oct 31 11:30:58 GMT+05:30 2014");

    System.out.println(out.format(date));
}