5

如何在 Java 中执行此转换?

目前,我正在做:

public static String formatDate(String strDateToFormat) {
    try {
        SimpleDateFormat sdfSource = new SimpleDateFormat("EEEE, MMMM DD, YYYY");
        Date date = sdfSource.parse(strDateToFormat);
        SimpleDateFormat sdfDestination = new SimpleDateFormat("yyyy-MM-dd");
        return sdfDestination.format(date);
    } catch (ParseException pe) {
        System.err.println("Parse Exception : " + pe);
    }

    return null;
}

但是,这会导致格式不正确。它给了我以下输出:

Friday, February 1, 2013 > 2013-01-04
Thursday, January 31, 2013 > 2013-01-03
4

3 回答 3

9

DD在解析部分使用,即一年中的某一天。你想要dd。您可能还想要yyyy(year) 而不是YYYY(week year)。(在大多数情况下,它们的值相同,但并非总是如此。)

于 2013-02-03T20:48:58.420 回答
3

您在解析部分使用 DD,即一年中的某一天。你想要 dd 代替。在 yyyy 中也更改 YYYY。

您可以在此处找到所有模式。

http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

于 2013-02-03T20:54:34.750 回答
2

您的代码有两个主要问题,现有答案已经解决了其中一个问题。第二个甚至更危险的问题是,不使用Localewith SimpleDateFormat,这是一种 -Locale敏感类型。由于您的日期时间字符串是英文的,请确保使用Locale.ENGLISH或其他一些英文- Locale。因此,正确的初始化将是:

SimpleDateFormat sdfSource = new SimpleDateFormat("EEEE, MMMM d, y", Locale.ENGLISH);

选中Never use SimpleDateFormat or DateTimeFormatter without a Locale以了解更多信息。另外,请注意一个单一d的,用于解析,可以同时满足月份日期的一位数和两位数表示。同样,一个单一的y可以同时满足两位数和四位数的年份表示。

切换到现代日期时间 API

请注意,java.util日期时间 API 及其格式化 APISimpleDateFormat已过时且容易出错。建议完全停止使用它们并切换到2014 年 3 月随 Java SE 8 发布的现代日期时间 API * 。

使用java.time现代日期时间 API 的解决方案

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

public class Main {
    public static void main(String[] args) {
        String input = "Friday, February 1, 2013";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE, MMMM d, u", Locale.ENGLISH);
        LocalDate date = LocalDate.parse(input, dtf);
        System.out.println(date);
    }
}

输出:

2013-02-01

ONLINE DEMO

一些注意事项:

  1. 在这里,您可以使用y代替,u我更喜欢u使用y.
  2. LocalDate#toString您提供String[ISO-8601 格式],这与您所期望的格式完全相同。因此,您无需LocalDate显式格式化即可获得String此格式的 a。

从Trail: Date Time了解有关现代日期时间 API 的更多信息。


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

于 2021-06-08T17:13:50.420 回答