java.util.Date biçim dönüştürme yyyy-aa-gg - mm-gg-yyyy


89

Bir var java.util.Datebir formatta yyyy-mm-dd. Formatta olmasını istiyorummm-dd-yyyy

Bu dönüştürme için denediğim örnek kullanım aşağıdadır:

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

Yine de aldığım çıktı formatta değil mm-dd-yyyy.

Lütfen bir ' java.util.Datedan' yyyy-mm-ddye nasıl biçimlendireceğimi bana bildirinmm-dd-yyyy


2
Derken ne demek istiyorsun .. yyyy-aa-gg formatında bir java.util.Date var mı?
Jayamohan

Bu, kodumdaki mevcut formatın UI'de görüntülenmesi için olduğu anlamına gelir yyyy-mm-dd.
user182944

1
lütfen küçük mm'yi MM olarak değiştirin
Dilip D

Yanıtlar:


158

Date Unix döneminden (1 Ocak 1970 00:00:00 UTC) beri geçen milisaniye sayısı için bir kapsayıcıdır.

Biçim kavramı yoktur.

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

Çıktılar...

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

Java 7-

Sen yararlanarak edilmelidir ThreeTen backport

Orijinal Cevap

Örneğin...

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

Çıktılar...

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

Biçimlendirmelerin hiçbiri temeldeki Datedeğeri değiştirmedi . Bu DateFormatters'nin amacı

Ek örnek ile güncellendi

İlk örnek mantıklı gelmezse diye ...

Bu örnek, aynı tarihi biçimlendirmek için iki biçimlendirici kullanır. Daha sonra aynı biçimlendiricileri, Stringdeğerleri tekrar Dates'ye ayrıştırmak için kullanıyorum . Ortaya çıkan ayrıştırma, Datedeğerinin raporlanma şeklini değiştirmez .

Date#toStringsadece içeriğinin bir dökümüdür. Bunu değiştiremezsiniz, ancak Datenesneyi istediğiniz gibi biçimlendirebilirsiniz

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

Hangi çıktılar ...

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

Ayrıca, biçim kalıplarına dikkat edin. SimpleDateFormatYanlış kalıpları kullanmadığınızdan emin olmak için daha yakından bakın ;)


Harika cevap bana yardımcı oldu. Biçimleri test etmek için bir komut satırı örnek uygulaması çalıştırmaya çalışıyordum (bir Android sınıfında kullanmadan önce) - ihtiyacım olan içe aktarmayı bulamadım. Verilen yanıtların hiçbiri şunu eklemeyi hatırlamıyor: import java.text.SimpleDateFormat;
raddevus

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

onun yerine

SimpleDateFormat("mm-dd-yyyy");

çünkü MM points Month,mm points minutes

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

Bu değişikliğin dışında, yukarıdaki kullanım yönteminde yapmam gereken başka bir değişiklik var mı? Hemen test edemiyorum, bu yüzden soruyorum. ALso, biçimlendirmenin daha iyi bir yolu var java.util.Datemı?
user182944

15

'M' (Büyük harf) ayı temsil eder ve 'm' (Basit) dakikayı temsil eder

Aylardır bir örnek

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

Dakikalar için bir örnek

'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" )
)

Detaylar

Yyyy-aa-gg biçiminde bir java.util.Date var

Diğer belirtildiği gibi, Datesınıfın bir formatı yoktur. UTC'de 1970'in başından bu yana bir milisaniye sayısı vardır. Koşulsuz.

java.time

Diğer Cevaplar, artık java.time sınıfları tarafından değiştirilen, zahmetli eski eski tarih-saat sınıflarını kullanır.

java.util.DateBir Instantnesneye sahipseniz , nesneye dönüştürün . InstantSınıfı zaman çizelgesinde bir anı temsil UTC çözünürlüğe sahip nanosaniye (ondalık kesir dokuz (9) haneye kadar).

Instant instant = myUtilDate.toInstant();

Saat dilimi

Diğer Cevaplar, önemli saat dilimi sorununu görmezden gelir. Bir tarih belirlemek, bir saat dilimi gerektirir. Herhangi bir an için tarih, dünya genelinde bölgeye göre değişir. Paris'te gece yarısından birkaç dakika sonra Fransa yeni bir gün, Montréal Québec'te ise hala “dün”.

Bağlamını istediğiniz zaman dilimini tanımlayın Instant.

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

Uygula ZoneIdbir olsun ZonedDateTime.

ZonedDateTime zdt = instant.atZone( z );

LocalDate

Günün saati olmadan yalnızca tarihi önemsiyorsanız, a LocalDate.

LocalDate localDate = zdt.toLocalDate();

Standart ISO 8601 biçiminde (YYYY-AA-GG) bir dize oluşturmak için çağırmanız yeterlidir toString. Java.time sınıfları, dizeleri oluştururken / ayrıştırırken varsayılan olarak standart biçimleri kullanır.

String output = localDate.toString();

2017-01-23

AA-GG-YYYY biçimi istiyorsanız, bir biçimlendirme modeli tanımlayın.

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

Biçimlendirme deseni kodlarının büyük / küçük harfe duyarlı olduğunu unutmayın. Soru'daki kod (yılın ayı mm) yerine yanlış kullanıldı (saatin dakikası MM).

DateTimeFormatterAyrıştırma için aynı nesneyi kullanın . Java.time sınıfları iş parçacığı açısından güvenlidir, bu nedenle bu nesneyi etrafta tutabilir ve iş parçacıkları arasında bile tekrar tekrar kullanabilirsiniz.

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

Java.time hakkında

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar&SimpleDateFormat .

Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi tavsiye ediyor .

Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Java.time derslerini nereden edinebilirim?

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time uygulamasına gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


1

Aşağıdaki kodların kullanımı basittir.

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) Bu kod, zaman dilimlerinin önemli sorununu görmezden geliyor. (B) Bu kod, yıllardır eski olan zahmetli eski tarih-saat sınıflarını kullanır. Onlardan kaçının. Java.time sınıfları tarafından desteklenir.
Basil Bourque

1

Gün, ay ve yılı alabilir ve bunları birleştirebilir veya aşağıda verilen MM-gg-yyyy biçimini kullanabilirsiniz.

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

Lütfen küçük "mm" ayı büyük "MM" olarak değiştirin, işe yarayacaktır. Referans için aşağıdaki örnek koddur.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.