将“2013年2月1日星期五”转换为“2013-02-01”

时间:2013-02-03 20:47:30

标签: java date simpledateformat

如何在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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

你在解析部分使用DD,这是一年中的某一天。你想要dd。 在yyyy也改变YYYY。

您可以在这里找到所有模式。

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

答案 2 :(得分:2)

您的代码有两个主要问题,现有答案已经解决了其中一个问题。第二个更危险的问题是,不要将 LocaleSimpleDateFormat 一起使用,Locale 是一种对 Locale.ENGLISH 敏感的类型。由于您的日期时间字符串是英文的,请确保使用 Locale 或其他一些英文-SimpleDateFormat sdfSource = new SimpleDateFormat("EEEE, MMMM d, y", Locale.ENGLISH); 。因此,正确的初始化将是:

d

查看 Never use SimpleDateFormat or DateTimeFormatter without a Locale 以了解更多信息。另外,请注意单个 y,对于解析,它既可以满足一位数也可以是两位数表示月份中的某一天。同样,单个 java.util 可以同时满足两位数和四位数的年份表示。

切换到现代日期时间 API

请注意,SimpleDateFormat 日期时间 API 及其格式 API java.time 已过时且容易出错。建议完全停止使用它们并改用 2014 年 3 月随 Java SE 8 发布的 modern Date-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); } } (现代日期时间 API)的解决方案

2013-02-01

输出:

y

ONLINE DEMO

一些注意事项:

  1. 在这里,您可以使用 u 代替 String,而是使用 I prefer u to y
  2. LocalDate#toString 为您提供 [ISO-8601 格式] 的 LocalDate,这与您期望的格式完全相同。因此,您无需显式格式化 String 即可获得此格式的 CAST

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


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