37

2012 年 12 月 1 日星期六 00:00:00 GMT

我必须将以上日期转换为以下格式

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;
  }
4

6 回答 6

83

用这个。

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
于 2012-12-26T10:23:36.167 回答
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);
于 2012-12-26T10:26:44.813 回答
4

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

乔达时间

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 );

运行时……</p>

dateTimeInKolkata formatted for date: 2013-12-17
dateTimeInKolkata formatted for ISO 8601: 2013-12-17T14:56:46.658+05:30
于 2013-12-17T09:32:36.733 回答
3

现代答案:使用LocalDatefrom java.time,现代 Java 日期和时间 API 及其toString方法:

    LocalDate date = LocalDate.of(2012, Month.DECEMBER, 1); // get from somewhere
    String formattedDate = date.toString();
    System.out.println(formattedDate);

这打印

2012-12-01

日期(无论我们是在谈论java.util.Date还是java.time.LocalDate)没有格式。它所拥有的只是一种toString产生某种格式的方法,而您无法更改该toString方法。幸运的是,LocalDate.toString生成的格式完全符合您的要求。

Date课程早已过时,而SimpleDateFormat您尝试使用的课程非常麻烦。我建议您忘记这些课程并java.time改用。现代 API 使用起来要好得多。

除了:碰巧您Date从遗留 API 中获得了一个您现在无法更改或不想更改的 API。您可以用它做的最好的事情是将其转换为java.time.Instant并从那里进行任何进一步的操作:

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

如果不是亚洲/贝鲁特,请替换您想要的时区。然后如上进行。

链接: Oracle教程:日期时间,讲解如何使用java.time

于 2018-01-22T11:09:31.863 回答
2

你不能格式化它Date本身。您只能在String. 按照其他人的说法使用SimpleDateFormat

而且,大部分getter methods in Date都是deprecated.

于 2012-12-26T10:34:03.997 回答
0

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

  • 现代日期时间类型的日期时间格式化 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对象不是像现代日期时间类型那样的真实日期时间对象;相反,它表示从Epoch of January 1, 1970. 当你打印一个 的对象时java.util.Date,它的toString方法返回从这个毫秒值计算出来的日期时间。由于java.util.Date没有时区信息,它会应用 JVM 的时区并显示相同的信息。如果您需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFomrat并从中获取格式化字符串。
  2. 日期时间 APIjava.util及其格式化 APISimpleDateFormat已过时且容易出错。建议完全停止使用它们并切换到现代日期时间 API
于 2021-01-03T00:17:10.360 回答