Java.util.Date'i String'e dönüştür


407

Java'da bir java.util.Datenesneyi dönüştürmek istiyorum String.

Biçim 2010-05-30 22:15:52



@harschware FYI, Joda-Time projesi şu anda bakım modunda ve ekip java.time sınıflarına geçişi tavsiye ediyor . Oracle'ın Öğreticisine bakın .
Basil Bourque

1
Date2019'da kullanmamanızı tavsiye ederim. Bu sınıf kötü tasarlanmış ve çok eski. Bunun yerine Instant, java.time, modern Java tarih ve saat API'sinden başka bir sınıf kullanın .
Ole VV

Yanıtlar:


757

Bir dönüştürme tarihi bir etmek dize kullanarak DateFormat#formatyöntemle:

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

Gönderen http://www.kodejava.org/examples/86.html


25
neden Calendardüz yerine kullanılır new Date()? Fark var mı?
Alexander Malakhov

10
Dikkat: SimpleDateFormat iş parçacığı için güvenli değildir. stackoverflow.com/questions/6840803/…
Zags

23
Takvim soyut bir sınıf, Tarih somut. Tarihin TimeZone, Locale veya hiç kullanmadığımız iyi şeyler hakkında hiçbir fikri yok.
nckbrz

30
MM/dd/yyyyBiçim aptal ve kırık olduğunu. Bunu kullanma. Daima dd/MM/yyyyveya kullanın yyyy-MM-dd.
SystemParadox

13
@SystemParadox - Aptalca, ama anlamsız gelmiyor. Özel olarak kullanmam istendi çünkü bu, insanların raporlarda bekledikleriyle eşleşiyor. (Her yeri tercih ederim yyyy-MM-dd, ama ne yapabilirsiniz?).
Sonbahar Leonard

223
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);

63

Commons-lang DateFormatUtils hediyelerle doludur (sınıf yolunuzda comm-lang varsa)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");

Ek bir nullkontrol gerektirir .
Farrukh Chishti

23

tl; Dr.

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

Modern yol, şimdi sorunlu eski eski tarih-saat sınıflarını tamamlayan java.time sınıflarıdır.

İlk java.util.Dateönce bir Instant. InstantSınıf içinde zaman çizelgesi üzerinde bir anını temsil UTC çözünürlüğe sahip nanosaniye (ondalık kesir dokuz (9) haneye kadar).

Java.time'a / java.time aralarından dönüşümler, eski sınıflara eklenen yeni yöntemlerle gerçekleştirilir.

Instant instant = myUtilDate.toInstant();

Hem sizin java.util.Datehem java.time.Instantde UTC'de . Tarih ve saati UTC olarak görmek istiyorsanız, öyle olsun. toStringStandart ISO 8601 biçiminde bir String oluşturmak için arayın .

String output = instant.toString();  

2014-11-14T14: 05: 09Z

Diğer formatlar için, Instantdaha esnek hale getirmeniz gerekir OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2020-05-01T21: 25: 35.957Z

Bu kodun IdeOne.com'da canlı yayınlandığını görün .

Bir Dizeyi istediğiniz biçimde almak için, a belirtin DateTimeFormatter. Özel bir biçim belirtebilirsiniz. Ancak, önceden tanımlanmış biçimlendiricilerden ( ISO_LOCAL_DATE_TIME) birini kullanır Tve çıktısında bir SPACE ile yer değiştiririm .

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Bu arada, UTC'den veya saat dilimi bilgisini bilerek kaybettiğiniz bu tür bir biçimi önermiyorum . Dizenin tarih-saat değerinin anlamı konusunda belirsizlik yaratır.

Ayrıca veri kaybına dikkat edin, çünkü String'inizin tarih-zaman değerini temsil etmesinde herhangi bir kesirli saniye yok sayılır (etkin bir şekilde kesilir).

Bazı belirli bölgenin merceğinden aynı anda görmek için duvar saatlik süre , bir geçerli ZoneIdbir olsun ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Amerika / Montreal]

Biçimlendirilmiş dize oluşturmak için, yukarıdaki gibi aynı şeyi ancak onların yerini odtile zdt.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Bu kodu çok sayıda yürütürseniz, biraz daha verimli olmak ve çağrı yapmaktan kaçınmak isteyebilirsiniz String::replace. Bu aramayı bırakmak da kodunuzu kısaltır. İstenirse, kendi DateTimeFormatternesnenizde kendi biçimlendirme deseninizi belirtin . Bu örneği yeniden kullanım için sabit veya üye olarak önbelleğe alın.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

Örneği geçirerek bu biçimlendiriciyi uygulayın.

String output = zdt.format( f );

Java.time hakkında

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

Artık bakım modunda olan Joda-Time projesi java.time'a geçişi tavsiye ediyor.

Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın.

Çok java.time işlevselliği Java 6 ve 7 geri-taşındıktan ThreeTen-backport ve daha fazla adapte Android içinde ThreeTenABP (bkz ... nasıl kullanılır ).

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir.


Java 8 Time API ile biçimlendirmenin kod örnekleri: stackoverflow.com/a/43457343/603516
Vadzim

bu kod çalışmaz OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 Aynı formata sahip yeni bir Java 8 kodu var 2014-11-14T14: 05: 09 + 00: 00? Teşekkür ederim
Bob Bolden

@BobBolden Doğru, varsayılan Zolarak kullanılır +00:00. Cevabı düzelttim, teşekkürler. FYI, bunlar aynı anlama geliyor: Z"Zulu" olarak telaffuz edilen , aynı sıfır saat-dakika-saniye ofseti anlamına geliyor +00:00. ISO 8601 standardı, her iki stilleri destekler.
Basil Bourque

@BasilBourque üzgünüm, bu belli değil. Java 8 var ve hiç instant.atOffset () yoktur. İnstant.atOffset () olmadan 2014-11-14T14: 05: 09 + 00: 00 tam olarak aynı formata sahip olmak için Java 8'in doğru kodunun ne olması gerektiğini tavsiye eder misiniz? Biraz kayboldum :(
Bob Bolden

@BobBolden gerçekten bir var atOffsetüzerinde yöntem InstantJava 8. Bkz Javadoc sınıfında: Instant::atOffset. Java 8'de benzeri bir çağrı yapılır Instant.now().atOffset( ZoneOffset.UTC ).toString(). importİfadelerinizi kontrol edin . IDE / projenizin önceki bir Java sürümü yerine Java 8 veya sonraki bir sürümünü çalıştıracak şekilde ayarlandığını doğrulayın. IdeOne.com'da canlı olarak çalıştırılan koda bakın: ideone.com/2Vm2O5
Basil Bourque

19

Sade eski Java'da alternatif tek gömlekler:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

Bu kullanır Biçimlendirici ve bağıl indeksleme yerine SimpleDateFormathangi parçacığı için güvenli değil btw.

Biraz daha tekrarlayan ama sadece bir ifadeye ihtiyaç var. Bu, bazı durumlarda kullanışlı olabilir.


1
Bu bir dahidir. Kısıtlı ortamlar için çok daha iyi performans
Ruslan

9

Neden Joda'yı kullanmıyorsunuz (org.joda.time.DateTime)? Temelde bir astar.

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09

DateTimeNesneye JVM'nin geçerli varsayılan saat dilimini atamak yerine bir DateTimeZone iletmeyi de öneririm . new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque

7

SimpleDateFormat'ı arıyorsunuz .

Biçim: yyyy-AA-gg kk: aa: ss


"Kk" özel bir şey yapıyor mu? Bence Eric 24 saat içinde istiyor.
Charlie Salts

2
Evet, günün saati (1-24), ama muhtemelen OP'nin ihtiyacı olan bu değil. HH(0-23) daha yaygındır.
BalusC

1
@Cahrlie Salts kk 1-24 arasında gider, burada HH 0-23 arasında gider ve muhtemelen 1-24 @BalusC DateFormat nesnesini hem ayrıştırma hem de formatlar istediğini varsaymak benim için biraz küstahtı.
pickypg

Son yorumunuzun alaka düzeyini anlamıyorum. Benim yorumum Charlie'ye oldu.
BalusC

HH 24 saat ve hh am / pm olduğunda .Net formatlarına alışkınım. Böylece kafa kaşıyor.
Charlie Salts

5

Tek çekimde;)

Tarih almak için

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

Zamanı Almak İçin

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

Tarih ve saati almak için

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

Mutlu kodlama :)


1
Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time Java 8 ve Java 9. Bkz yerleşik sınıflara Oracle tarafından Öğreticisi .
Basil Bourque

4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}

4

Kullanmanın en kolay yolu aşağıdaki gibidir:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

burada "yyyy-AA-gg'T'HH: aa: ss" okuma tarihinin biçimidir

çıktı: Paz 14 Nis 16:11:48 EEST 2013

Notlar: HH - hh - HH 24 saat biçimini ifade eder - ss 12 saat biçimini ifade eder


Soru ters dönüşümle ilgili.
Vadzim

4

Yalnızca tarihten itibaren zamana ihtiyacınız varsa, Dize özelliğini kullanabilirsiniz.

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

Bu, Dizenin zaman bölümünü otomatik olarak kesecek ve içine kaydedecektir timeString.


Bu, farklı yerel ayarlarla kırılabilir.
Vadzim

4

Eski formatı biçimlendirmek için yeni Java 8 Zaman API'sini kullanma örnekleri : java.util.Date

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

DateTimeFormatterİplik açısından güvenli (aksine SimpleDateFormat) verimli bir şekilde önbelleğe alınabilir olması güzel .

Önceden tanımlanmış fomatterler ve kalıp gösterim referansı listesi .

Kredi:

LocalDateTime ile tarihler nasıl ayrıştırılır / biçimlendirilir? (Java 8)

Java8 java.util.Date, java.time.ZonedDateTime dönüştürmesi

Anında Dizeye Biçimlendirme

Java 8 ZonedDateTime ve OffsetDateTime arasındaki fark nedir?


2

Bunu dene,

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

Çıktı:

2013-05-14 17:07:21

Java'da tarih ve saat biçimlendirmesi hakkında daha fazla bilgi için aşağıdaki bağlantılara bakın

Oracle Yardım Merkezi

Java'da tarih saat örneği


1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}

1

Hadi bunu deneyelim

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

Veya bir yardımcı program işlevi

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

Gönderen Java String dönüştürme tarihi


1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String

1
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);

1

Bir Satır seçeneği

Bu seçenek, gerçek tarihi yazmak için tek bir satır alır.

Lütfen bunun Calendar.classve kullandığını ve SimpleDateFormatJava8 altında kullanmanın mantıklı olmadığını unutmayın.

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

1
Bilginize gibi korkunç zahmetli tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

1
(1) Cevap yanlış (az önce 2019-20-23 09:20:22- 20 ay aldım ??) (2) Cevabın başka cevaplarda henüz ele alınmamış bir şey sunduğunu göremiyorum. (3) Lütfen gençlere uzun süredir modası geçmiş ve meşhur zahmetli SimpleDateFormatsınıfı kullanmayı öğretmeyin . En azından ilk seçenek olarak değil. Ve herhangi bir rezervasyon olmadan. Bugün java.time, modern Java tarih ve saat API'sı ve onun çok daha iyi var DateTimeFormatter.
Ole VV

Evet .... Bir hata yaptım ve düzeltmeyi unuttum. Ben hızlı bir şekilde ekledi ve hatırlamadım .. üzgünüm !! ve yorumlarınız için teşekkürler beyler
Alejandro Teixeira Muñoz

@ OleV.V. Herkesin Modern Java verilerine ve zaman api'ye erişimi yoktur ... yani ... Bu cevap da geçerlidir ...
Alejandro Teixeira Muñoz

1
Yorumun için teşekkürler. Java 5 veya herhangi bir harici bağımlılık olmadan Java 6 ve 7 için bir cevap vermek istiyorsanız, çok iyi, bu hoş geldiniz, sadece yaptığınız şeyin bu olduğunu açıkça belirtin. Ve cevabınız hala yanlış, Yeni Yıl çevresinde sürprizler alacaksınız.
Ole VV
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.