ISO兼容日期的自定义字符串

时间:2014-04-10 08:28:43

标签: java date date-format simpledateformat

我的日期字符串为2014-01-11-T00:00:00Z 我想将此日期转换为20140111,即YYYYMMDD它应该是一个字符串。

要实现上述任何标准方法/功能吗?

5 个答案:

答案 0 :(得分:1)

java.time

您的日期时间字符串 2014-01-11-T00:00:00Z 有点奇怪,因为我从未见过这样的日期时间字符串在 - 之前有一个连字符 (T)。对于这种字符串,以下模式满足解析要求:

yyyy-M-d-'T'H:m:sXXX

此外,对于 java.time API,我建议您按照 this answer 中的说明将 y 替换为 u。对于输出字符串,您无需定义任何模式,因为此模式已存在内置 DateTimeFormatterDateTimeFormatter.BASIC_ISO_DATE

演示:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("u-M-d-'T'H:m:sXXX", Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse("2014-01-11-T00:00:00Z", dtfInput);
        System.out.println(odt);

        String output = odt.toLocalDate().format(DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println(output);
    }
}

输出:

2014-01-11T00:00Z
20140111

注意:

  1. 如果您的日期时间字符串符合 ISO 8601 标准,您就不需要显式使用 DateTimeFormatter 对象进行解析,即您可以简单地将其解析为
    OffsetDateTime odt = OffsetDateTime.parse("2014-01-11T00:00:00Z");
  1. 日期时间中的 Z 代表 Zulu,它指定 ISO 8601 标准中的 UTC 时间(时区偏移为 +00:00 小时)。因此,此解决方案也适用于具有 2014-01-11-T00:00:00+02:00 小时时区偏移量的 +02:00 之类的日期时间字符串。
  2. 如果您需要来自 java.util.Date 的对象的 OffsetDateTime 对象,您可以按如下方式进行:
    Date date = Date.from(odt.toInstant());

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

请注意,旧的日期时间 API(java.util 日期时间类型及其格式 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用它们并切换到 java.time API。为了完整起见,我为您提供了一个使用旧 API 的解决方案。

使用旧 API:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main {
    public static void main(String args[]) throws ParseException {
        SimpleDateFormat sdfInput = new SimpleDateFormat("yyyy-M-d-'T'H:m:sXXX", Locale.ENGLISH);

        SimpleDateFormat sdfOutput = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH);
        sdfOutput.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));// Change it as required

        Date date = sdfInput.parse("2014-01-11-T00:00:00Z");

        String output = sdfOutput.format(date);
        System.out.println(output);
    }
}

输出:

20140111

* 出于任何原因,如果您必须坚持使用 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)

拿这个

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormat {

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd-'T'HH:mm:ss'Z'");
        Date inDate = inFormat.parse("2014-01-11-T00:00:00Z");

        SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMdd");
        String output = outFormat.format(inDate);

        System.out.println("Date: " + output);

    }
}

答案 2 :(得分:0)

使用Zoulou表示法查看此线程中的Java日期格式:

Converting ISO 8601-compliant String to java.util.Date

然后使用" yyyyMMdd"创建一个新的SimpleDateFormat;格式字符串。

答案 3 :(得分:0)

这是@drkunibar给出答案的改进版本:

SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd-'T'HH:mm:ss'Z'");
inFormat.setTimeZone(TimeZone.getTimeZone("GMT")); // Z denotes UTC in ISO-8601
Date inDate = inFormat.parse("2014-01-11-T00:00:00Z");

SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMdd");
outFormat.setTimeZone(TimeZone.getTimeZone("...")); // set your timezone explicitly!
String output = outFormat.format(inDate);

System.out.println("Date: " + output);

请注意,YYYYMMDD格式也符合ISO-8601标准(所谓的基本日历日期)。你必须问自己的问题是你希望在哪个时区得到你的输出。如果在UTC中,您还必须设置" GMT"。如果没有设置时区,您的输出日期可能会与输入UTC日期相差一天,具体取决于您的默认系统时区(例如,美国比UTC晚几个小时,在这种情况下是UTC午夜前的一个日历日)。

答案 4 :(得分:0)

约达时间

使用Joda-Time 2.3库可以更轻松地完成日期工作。

String input = "2014-01-11T00:00:00Z";  // In standard ISO 8601 format.
DateTime dateTime = new DateTime( input, DateTimeZone.UTC );  // Parse string into date-time object.
DateTimeFormatter formatter = ISODateTimeFormat.basicDate();  // Factory to make a formatter.
String output = formatter.print( dateTime );  // Generate string from date-Time object.