java.util.Date格式将yyyy-mm-dd转换为mm-dd-yyyy


88

我有一个java.util.Date格式yyyy-mm-dd。我希望它采用以下格式mm-dd-yyyy

以下是我尝试进行此转换的示例util:

// Setting the pattern
SimpleDateFormat sm = new SimpleDateFormat("mm-dd-yyyy");
// myDate is the java.util.Date in yyyy-mm-dd format
// Converting it into String using formatter
String strDate = sm.format(myDate);
//Converting the String back to java.util.Date
Date dt = sm.parse(strDate);

我得到的输出仍然不是格式mm-dd-yyyy

请让我知道如何格式化java.util.Dateyyyy-mm-ddmm-dd-yyyy


2
您说的是什么意思..我有一个yyyy-mm-dd格式的java.util.Date?
Jayamohan

这意味着我的代码中用于显示给UI的当前格式为yyyy-mm-dd
user182944

1
改小

Answers:


157

Date 是自Unix纪元(1970年1月1日UTC:00:00)以来的毫秒数的容器。

它没有格式的概念。

Java 8+

LocalDateTime ldt = LocalDateTime.now();
System.out.println(DateTimeFormatter.ofPattern("MM-dd-yyyy", Locale.ENGLISH).format(ldt));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH).format(ldt));
System.out.println(ldt);

输出...

05-11-2018
2018-05-11
2018-05-11T17:24:42.980

Java 7-

您应该利用ThreeTen Backport

原始答案

例如...

Date myDate = new Date();
System.out.println(myDate);
System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(myDate));
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(myDate));
System.out.println(myDate);

输出...

Wed Aug 28 16:20:39 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 16:20:39 EST 2013

没有一种格式更改了基础Date值。这是DateFormatters的目的

更新了其他示例

万一第一个例子没有道理...

本示例使用两个格式化程序来格式化同一日期。然后,我使用这些相同的格式化程序将String值解析回Dates。产生的解析不会改变Date报告其值的方式。

Date#toString只是其中内容的转储。您不能更改此设置,但是可以Date按照自己喜欢的任何方式格式化对象

try {
    Date myDate = new Date();
    System.out.println(myDate);

    SimpleDateFormat mdyFormat = new SimpleDateFormat("MM-dd-yyyy");
    SimpleDateFormat dmyFormat = new SimpleDateFormat("yyyy-MM-dd");

    // Format the date to Strings
    String mdy = mdyFormat.format(myDate);
    String dmy = dmyFormat.format(myDate);

    // Results...
    System.out.println(mdy);
    System.out.println(dmy);
    // Parse the Strings back to dates
    // Note, the formats don't "stick" with the Date value
    System.out.println(mdyFormat.parse(mdy));
    System.out.println(dmyFormat.parse(dmy));
} catch (ParseException exp) {
    exp.printStackTrace();
}

哪个输出...

Wed Aug 28 16:24:54 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 00:00:00 EST 2013
Wed Aug 28 00:00:00 EST 2013

另外,请注意格式模式。仔细检查SimpleDateFormat以确保您没有使用错误的模式;)


好答案对我有所帮助。试图运行一个命令行示例应用程序以测试格式(在Android类中使用之前)–找不到我需要的导入。提供的答案中没有一个记得包含以下内容:import java.text.SimpleDateFormat;
raddevus

34
SimpleDateFormat("MM-dd-yyyy");

代替

SimpleDateFormat("mm-dd-yyyy");

因为MM points Monthmm points minutes

SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);

除了此更改之外,我还需要在上述util方法中进行任何其他更改吗?我无法立即对其进行测试,因此提出了这一要求。另外,还有什么更好的格式化格式的方法java.util.Date吗?
user182944

15

“ M”(大写)代表月份,“ m”(简单)代表分钟

几个月的例子

'M' -> 7  (without prefix 0 if it is single digit)
'M' -> 12

'MM' -> 07 (with prefix 0 if it is single digit)
'MM' -> 12

'MMM' -> Jul (display with 3 character)

'MMMM' -> December (display with full name)

几分钟的例子

'm' -> 3  (without prefix 0 if it is single digit)
'm' -> 19
'mm' -> 03 (with prefix 0 if it is single digit)
'mm' -> 19

3

tl; dr

LocalDate.parse( 
    "01-23-2017" , 
    DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)

细节

我有一个格式为yyyy-mm-dd的java.util.Date

如前所述, Date该类没有格式。自1970年UTC以来,它具有毫秒数。没有任何附加条件。

java.time

其他答案使用麻烦的旧式旧式日期时间类,现在由java.time类取代。

如果有java.util.Date,则转换为Instant对象。该Instant级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。

Instant instant = myUtilDate.toInstant();

时区

其他答案则忽略了时区这一关键问题。确定日期需要一个时区。在任何给定时刻,日期都会在全球范围内变化。在巴黎午夜过后的几分钟,法国是新的一天,而在魁北克蒙特利尔仍然是“昨天”。

定义您要为其提供上下文的时区Instant

ZoneId z = ZoneId.of( "America/Montreal" );

套用ZoneId取得ZonedDateTime

ZonedDateTime zdt = instant.atZone( z );

LocalDate

如果您只关心日期而不是时间,请提取LocalDate

LocalDate localDate = zdt.toLocalDate();

要生成标准ISO 8601格式的字符串YYYY-MM-DD,只需调用toString。生成/解析字符串时,默认情况下java.time类使用标准格式。

String output = localDate.toString();

2017-01-23

如果要使用MM-DD-YYYY格式,请定义格式格式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );

请注意,格式化模式代码区分大小写。问题中的代码使用不正确mm(小时数),而不是MM(一年中的月份)。

使用相同的DateTimeFormatter对象进行解析。java.time类是线程安全的,因此您可以保留该对象,甚至在线程之间也可以重复使用。

LocalDate localDate = LocalDate.parse( "01-23-2017" , f );

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容打下了基础。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


1

下面的代码很容易使用。

final Date todayDate = new Date();

System.out.println(todayDate);

System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(todayDate));

System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(todayDate));

System.out.println(todayDate);

(A)此代码忽略了时区的关键问题。(B)此代码使用了麻烦的旧日期时间类,这些类已经存在多年了。避免他们。由java.time类取代。
罗勒·布尔克

1

您可以获取日,月和年,并可以将它们连接起来,或者可以使用MM-dd-yyyy格式,如下所示。

Date date1 = new Date();
String mmddyyyy1 = new SimpleDateFormat("MM-dd-yyyy").format(date1);
System.out.println("Formatted Date 1: " + mmddyyyy1);



Date date2 = new Date();
Calendar calendar1 = new GregorianCalendar();
calendar1.setTime(date2);
int day1   = calendar1.get(Calendar.DAY_OF_MONTH);
int month1 = calendar1.get(Calendar.MONTH) + 1; // {0 - 11}
int year1  = calendar1.get(Calendar.YEAR);
String mmddyyyy2 = ((month1<10)?"0"+month1:month1) + "-" + ((day1<10)?"0"+day1:day1) + "-" + (year1);
System.out.println("Formatted Date 2: " + mmddyyyy2);



LocalDateTime ldt1 = LocalDateTime.now();  
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy3 = ldt1.format(format1);  
System.out.println("Formatted Date 3: " + mmddyyyy3);  



LocalDateTime ldt2 = LocalDateTime.now();
int day2 = ldt2.getDayOfMonth();
int mont2= ldt2.getMonthValue();
int year2= ldt2.getYear();
String mmddyyyy4 = ((mont2<10)?"0"+mont2:mont2) + "-" + ((day2<10)?"0"+day2:day2) + "-" + (year2);
System.out.println("Formatted Date 4: " + mmddyyyy4);



LocalDateTime ldt3 = LocalDateTime.of(2020, 6, 11, 14, 30); // int year, int month, int dayOfMonth, int hour, int minute
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy5 = ldt3.format(format2);   
System.out.println("Formatted Date 5: " + mmddyyyy5); 



Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
int day3  = calendar2.get(Calendar.DAY_OF_MONTH); // OR Calendar.DATE
int month3= calendar2.get(Calendar.MONTH) + 1;
int year3 = calendar2.get(Calendar.YEAR);
String mmddyyyy6 = ((month3<10)?"0"+month3:month3) + "-" + ((day3<10)?"0"+day3:day3) + "-" + (year3);
System.out.println("Formatted Date 6: " + mmddyyyy6);



Date date3 = new Date();
LocalDate ld1 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date3)); // Accepts only yyyy-MM-dd
int day4  = ld1.getDayOfMonth();
int month4= ld1.getMonthValue();
int year4 = ld1.getYear();
String mmddyyyy7 = ((month4<10)?"0"+month4:month4) + "-" + ((day4<10)?"0"+day4:day4) + "-" + (year4);
System.out.println("Formatted Date 7: " + mmddyyyy7);



Date date4 = new Date();
int day5   = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getDayOfMonth();
int month5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getMonthValue();
int year5  = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getYear();
String mmddyyyy8 = ((month5<10)?"0"+month5:month5) + "-" + ((day5<10)?"0"+day5:day5) + "-" + (year5);
System.out.println("Formatted Date 8: " + mmddyyyy8);



Date date5 = new Date();
int day6   = Integer.parseInt(new SimpleDateFormat("dd").format(date5));
int month6 = Integer.parseInt(new SimpleDateFormat("MM").format(date5));
int year6  = Integer.parseInt(new SimpleDateFormat("yyyy").format(date5));
String mmddyyyy9 = ((month6<10)?"0"+month6:month6) + "-" + ((day6<10)?"0"+day6:day6) + "-" + (year6);`enter code here`
System.out.println("Formatted Date 9: " + mmddyyyy9);

1

请将小写的“ mm”月份更改为大写的“ MM”。以下示例代码供参考。

        Date myDate = new Date();
        SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
       
        String strDate = sm.format(myDate);
        
        Date dt = sm.parse(strDate);
        System.out.println(strDate);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.