如何将日期转换为 yyyy-MM-dd 格式?

43

将上述日期转换为下面的格式:2012-12-01。

我该怎么做?

我尝试了以下方法,但它不起作用。

public Date ConvertDate(Date date){

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    String s = df.format(date);
    String result = s;
    try {
        date=df.parse(result);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return date;
  }

这个方法 public Date ConvertDate(Date date) 的含义是什么? - vels4j
@vels4j 返回的日期格式为yyyy-MM-dd。 - BhavikKama
@Oded,我只是太匆忙了,所以没注意。对此感到抱歉。 - BhavikKama
上述链接中的输入是一个字符串,而你的输入是一个日期对象。看了下面的答案(以及你选择的答案),我仍然不明白那个问题为什么不能帮助你。 - Sayan
我认为你误解了。Date 没有格式。你只能在 Date 外的 String 中拥有你想要的格式。详见 All about java.util.Date - Ole V.V.
显示剩余2条评论
6个回答

93

使用这个。

java.util.Date date = new Date("Sat Dec 01 00:00:00 GMT 2012");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String format = formatter.format(date);
System.out.println(format);

你将会得到如下输出

2012-12-01

1
+1 和 new Date() 方法已被弃用,必须使用 Calendar。 - vels4j
2
@vels4j 为什么不分享使用日历替代已弃用的日期构造函数的代码呢? - Suresh

4
String s;
Format formatter;
Date date = new Date();

// 2012-12-01
formatter = new SimpleDateFormat("yyyy-MM-dd");
s = formatter.format(date);
System.out.println(s);

4

更新:我的回答已过时。Joda-Time项目现在处于维护模式,建议迁移到java.time类。请参阅Ole V.V.的答案中的现代解决方案。

Joda-Time

NidhishKrishnan提供的被接受的答案是正确的。

作为乐趣,这里是同样类型的代码在Joda-Time 2.3中的写法。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

java.util.Date date = new Date(); // A Date object coming from other code.

// Pass the java.util.Date object to constructor of Joda-Time DateTime object.
DateTimeZone kolkataTimeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeInKolkata = new DateTime( date, kolkataTimeZone );

DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyy-MM-dd");
System.out.println( "dateTimeInKolkata formatted for date: " + formatter.print( dateTimeInKolkata ) );
System.out.println( "dateTimeInKolkata formatted for ISO 8601: " + dateTimeInKolkata );

When run…

dateTimeInKolkata formatted for date: 2013-12-17
dateTimeInKolkata formatted for ISO 8601: 2013-12-17T14:56:46.658+05:30

3
现代做法:使用Java的现代日期和时间API中的LocalDate,以及它的toString方法。
    LocalDate date = LocalDate.of(2012, Month.DECEMBER, 1); // get from somewhere
    String formattedDate = date.toString();
    System.out.println(formattedDate);

这会打印

2012年12月1日

一个日期(无论是 java.util.Date 还是 java.time.LocalDate)本身没有格式。它只有一个 toString 方法,用于生成一些格式,并且您不能更改 toString 方法。幸运的是,LocalDate.toString 产生了您要求的确切格式。

Date 类已经过时,而您尝试使用的 SimpleDateFormat 类非常麻烦。我建议您忘记这些类,改用 java.time。现代 API 更加易于使用。

但是:如果您从无法更改或暂时不想更改的遗留 API 中获取了一个 Date,则可以将其转换为 java.time.Instant 并从那里进行任何进一步操作:

    Date oldfashoinedDate = // get from somewhere
    LocalDate date = oldfashoinedDate.toInstant()
            .atZone(ZoneId.of("Asia/Beirut"))
            .toLocalDate();

请在需要时更改您所需的时区,如果不是亚洲/贝鲁特。然后按上述步骤进行。
链接:Oracle教程:日期时间,介绍如何使用java.time

2

你不能格式化 Date 本身,你只能得到格式化后的结果字符串。如其他人所提到的,可以使用 SimpleDateFormat

此外,大多数 Date 中的 getter 方法 都已经 被弃用


0

日期时间对象应该存储有关日期、时间、时区等信息,而不是有关格式的信息。您可以使用日期时间格式化 API 将日期时间对象格式化为您选择的模式的String

  • 现代日期时间类型的日期时间格式化 API 位于包中,java.time.format,例如 java.time.format.DateTimeFormatterjava.time.format.DateTimeFormatterBuilder 等。
  • 传统日期时间类型的日期时间格式化 API 位于包中,java.text,例如 java.text.SimpleDateFormatjava.text.DateFormat 等。

使用现代 API 的演示:

import java.time.LocalDate;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        ZonedDateTime zdt = ZonedDateTime.of(LocalDate.of(2012, Month.DECEMBER, 1).atStartOfDay(),
                ZoneId.of("Europe/London"));

        // Default format returned by Date#toString
        System.out.println(zdt);

        // Custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
        String formattedDate = dtf.format(zdt);
        System.out.println(formattedDate);
    }
}

输出:

2012-12-01T00:00Z[Europe/London]
2012-12-01

Trail: Date Time了解现代日期时间API。

使用传统API的演示:

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

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        calendar.setTimeInMillis(0);
        calendar.set(Calendar.YEAR, 2012);
        calendar.set(Calendar.MONTH, 11);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        Date date = calendar.getTime();

        // Default format returned by Date#toString
        System.out.println(date);

        // Custom format
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
        String formattedDate = sdf.format(date);
        System.out.println(formattedDate);
    }
}

输出:

Sat Dec 01 00:00:00 GMT 2012
2012-12-01

一些更重要的点:

  1. java.util.Date 对象不是像 现代日期时间类型 那样的真正日期时间对象;而是代表自 1970 年 1 月 1 日纪元 起的毫秒数。当您打印一个 java.util.Date 对象时,它的 toString 方法返回从这个毫秒值计算出的日期时间。由于 java.util.Date 没有时区信息,它会应用您的 JVM 时区并显示相同的时间。如果您需要在不同的时区打印日期时间,则需要设置时区为 SimpleDateFormat 并从中获取格式化字符串。
  2. java.util 的日期时间 API 及其格式化 API SimpleDateFormat 已经过时且容易出错。建议完全停止使用它们,改用 现代日期时间 API

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接