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.