如何格式化此日期“ 2018-08-02T00:00:00 + 05:30”的字符串至此“ 2018-18-02”

时间:2018-08-07 05:08:03

标签: java date

public class Kf_Date {

    public static String getDateUsingOracleFormat(String date) {
        try {
            DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss.S");
            Date date2 = inputFormat.parse(date);
            SimpleDateFormat sdf = new SimpleDateFormat("YYY-MM-dd");
            String outputText = sdf.format(date2);
            return outputText;
        } catch(Exception e) {
            e.printStackTrace();
            return e.toString();
        }
    }

    public static void main(String... args) {
        System.out.println(new Kf_Date().getDateUsingOracleFormat("2018-08-02T00:00:00+05:30"));
    }

}

4 个答案:

答案 0 :(得分:3)

您可以使用DateTimeFormatter

DateTimeFormatter.ofPattern("yyyy-MM-dd")
   .format(ZonedDateTime.parse("2018-08-02T00:00:00+05:30"))

返回"2018-08-02"。上面的parse调用了解您输入的ISO格式。

这是较新的推荐API。如果您使用的Java版本早于8,则应使用:

Date input = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
                 .parse("2018-08-02T00:00:00+05:30");
String output = new SimpleDateFormat("yyyy-MM-dd")
                 .format(input);

这将返回相同的字符串。

答案 1 :(得分:2)

java.time

public static String getDateUsingOracleFormat(String date) {
    OffsetDateTime dateTime = OffsetDateTime.parse(date);
    String outputText = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE);
    return outputText;
}

使用此方法声明,您的main打印:

  

2018-08-02

您的两种格式(正在解析的格式和正在生成的格式)均符合ISO 8601(底部的链接)。现代Java日期和时间API java.time类解析并打印此格式为默认格式,即没有任何显式格式化程序。格式器也是内置的,因此我使用一种格式器来指定我们要格式化的日期没有日期和与UTC的偏移量。无需编写自己的格式化程序就容易出错。

您的代码出了什么问题?

正如其他人所说,您的格式模式字符串与您尝试解析100%的日期时间字符串不匹配。格式要求在那秒之后应该有一个点和几毫秒。相反,您的字符串有一个偏移量+05:30。这导致异常。相比之下,一个参数OffsetDateTime.parse可以接受带或不带毫秒的字符串(因为它们在ISO 8601中是可选的)(但确实需要偏移量)。

您的代码中还有一个错误:您要格式化的格式模式中使用大写YYY。这有时会给您错误的年份。小写y用于年份。大写的Y用于年份,仅与星期编号一起使用。

此外,由于您的方法是静态的,因此您无需创建实例来调用它。只要做:

    System.out.println(Kf_Date.getDateUsingOracleFormat("2018-08-02T00:00:00+05:30"));

链接

答案 2 :(得分:1)

除此行外,您具有正确的代码。在输入模式中使用 XXX 代替 .S

DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ssXXX");

根据Class SimpleDateFormat

  • X -时区,ISO 8601时区(-08; -0080; -08:-00)
  • S -毫秒,数字(978)

提示:

如果您在解析日期字符串时遇到问题,并且不知道模式中出了什么问题,那么只需打印当前日期并将其与输入字符串进行比较即可。然后,您可以看到差异并修复模式:

DateFormat inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss.S");
System.out.println(inputFormat.format(new Date())); // 2018-08-07T08:28:33.800

inputFormat = new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ssXXX");
System.out.println(inputFormat.format(new Date())); // 2018-08-07T08:28:33+03:00

答案 3 :(得分:1)

您可以这样使用ISO模式:

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

public class DateTimeUtils {

    public static String format(String inputDate, String inputFormat, String outputFormat) throws ParseException {
        DateFormat fromFormat = new SimpleDateFormat(inputFormat);
        fromFormat.setLenient(false);
        DateFormat toFormat = new SimpleDateFormat(outputFormat);
        toFormat.setLenient(false);
        Date date = fromFormat.parse(inputDate);
        return toFormat.format(date);
    }

    public static void main(String[] args) throws ParseException {
        System.out.println(DateTimeUtils.format("2018-08-02T00:00:00+05:30", "yyyy-MM-dd'T'HH:mm:ssXXX", "yyyy-MM-dd"));
    }

}