YYYY-AA-GG SS: MI: Sec. Milisaniye formatında geçerli saati nasıl alabilirim?


641

Aşağıdaki kod bana şimdiki zamanı veriyor. Ancak milisaniye hakkında bir şey söylemiyor.

public static String getCurrentTimeStamp() {
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//dd/MM/yyyy
    Date now = new Date();
    String strDate = sdfDate.format(now);
    return strDate;
}

Tarih biçimini alıyorum 2009-09-22 16:47:08 (YYYY-AA-GG SS: MI: Sn) .

Ama geçerli saati 2009-09-22 16:47:08.128((YYYY-AA-GG SS: MI: Sn.Ms) biçiminde almak istiyorum - burada 128 milisaniyeyi söylüyor.

SimpleTextFormatiyi çalışır. Burada en düşük zaman birimi ikinci, ama milisaniyeyi nasıl alabilirim?


32
Her şey başarısız olduğunda, belgeleri okuyun .
Hot Licks

4
Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleTextFormatşimdi mirası supplanted, java.time sınıfları. Oracle'ın Öğreticisine bakın .
Basil Bourque

Yanıtlar:


1003
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Merak ettikten sonra, SimpleDateFormat kullanmanın sadece: dateTime.ToString ("yyyy-AA-gg SS: dd: ss.SSS") ne fayda sağlar?
NickG

10
@NickG Bu toString(String format)yöntem nerede ? java.util.DateOna sahip görünmemektedir. Joda Time API'sından mı bahsediyorsunuz? Ancak olası bir fayda, aynı formatlayıcı nesnesinin tekrar kullanılmasıdır. Başka bir API eklemek zorunda değilsiniz - Date sınıfı standart bir Java kütüphane sınıfı.
ADTC

22
Java 8'de DateTimeFormatter'ı aynı amaçla kullanabilirsiniz.
Vitalii Fedorenko

7
SimpleDateFormat iş parçacığı için güvenli değildir, ancak daha yeni DateTimeFormatter iş parçacığı için güvenlidir.
devdanke

15
Java 8 datetime API'sini kullanma:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha

202

Bir Java bir astarı

public String getCurrentTimeStamp() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
}

JDK8 tarzında

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}

9
LocalDateTime ve DateTimeFormatter, SimpleDateFormat'ın aksine iş parçacığı açısından güvenlidir
Maxple

@ SimpleDateFormat'ın sorunlara neden olduğu herhangi bir durumda?
gaurav




31

tl; Dr.

Instant.now()
       .toString()

2016-05-06T23: 24: 25.694Z

ZonedDateTime
.now
( 
    ZoneId.of( "America/Montreal" ) 
)
.format(  DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )

2016-05-06 19: 24: 25.694

java.time

Java 8 ve sonraki sürümlerinde, Java 8 ve sonraki sürümlerinde yerleşik java.time çerçevesine sahibiz . Bu yeni sınıflar, sorunlu eski java.util.Date/.Calendar sınıflarını destekliyor. Yeni sınıflar , halefi olarak düşünülen, konseptte benzer ancak yeniden tasarlanmış , son derece başarılı Joda-Time çerçevesinden ilham alıyor . JSR 310 tarafından tanımlanmıştır . ThreeTen-Extra projesi ile genişletildi . Eğiticiye bakın .

Java.time değerinin , her iki java.util.Tarih ve Joda-Time değerinin milisaniye çözünürlüğüne (3 ondalık basamak) karşı nanosaniye çözünürlük (saniyenin ondalık kısmında 9 ondalık basamak) yapabildiğini unutmayın . Bu nedenle, yalnızca 3 ondalık basamak görüntüleyecek şekilde biçimlendirme yaparken, verileri gizliyor olabilirsiniz.

Verilerinizden herhangi bir mikrosaniye veya nanosaniye ortadan kaldırmak istiyorsanız, kısaltın.

Instant instant2 = instant.truncatedTo( ChronoUnit.MILLIS ) ;

Java.time sınıfları, dizeleri ayrıştırırken / oluştururken varsayılan olarak ISO 8601 biçimini kullanır. Sondaki A Z, kısa Zuluanlamına gelir ve UTC anlamına gelir .

An Instant, UTC'deki zaman çizelgesinde nanosaniyeye kadar çözünürlüğe sahip bir anı temsil eder . Java 8'de geçerli anı yakalamak milisaniye ile sınırlıdır , Java 9'da yeni bir uygulama bilgisayarınızın donanım saatinin yeteneklerine bağlı olarak nanosaniye kadar yakalar.

Instant instant = Instant.now (); // Current date-time in UTC.
String output = instant.toString ();

2016-05-06T23: 24: 25.694Z

Değiştir Tboşlukla ortada ve Zhiçbir şey, istediğiniz çıktıyı almak için.

String output = instant.toString ().replace ( "T" , " " ).replace( "Z" , "" ; // Replace 'T', delete 'Z'. I recommend leaving the `Z` or any other such [offset-from-UTC][7] or [time zone][7] indicator to make the meaning clear, but your choice of course.

2016-05-06 23: 24: 25.694

Ofseti veya saat dilimini dahil etmeyi umursamadığınız için, belirli bir yerle alakasız bir "yerel" tarih-saat yapın.

String output = LocalDateTime.now ( ).toString ().replace ( "T", " " );

Joda-Time

Son derece başarılı Joda-Time kütüphanesi, java.time çerçevesine ilham kaynağı oldu. Uygun olduğunda java.time'a geçilmesi tavsiye edilir.

ISO 8601 formatlı milisaniye içerir ve varsayılan olan Joda-Time 2.4 kütüphanesine.

System.out.println( "Now: " + new DateTime ( DateTimeZone.UTC ) );

Çalıştırıldığında…

Now: 2013-11-26T20:25:12.014Z

Ayrıca, gerekirse milisaniye saniyenin bir kısmını sayı olarak isteyebilirsiniz:

int millisOfSecond = myDateTime.getMillisOfSecond ();

9

Ben böyle bir şey kullanmak istiyorum:

String.format("%tF %<tT.%<tL", dateTime);

Değişken dateTimeherhangi bir tarih ve / veya saat değeri olabilir, bkz. JavaDocFormatter .


9

En kolay yol (Java 8'den önce) kullanmak,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Ancak SimpleDateFormat iş parçacığı için güvenli değildir. Hiçbiri java.util.Date . Bu, kullanıcılar için olası eşzamanlılık sorunlarına yol açacaktır. Ve mevcut tasarımlarda birçok sorun var. Java 8'de bunların üstesinden gelmek için java.time adında ayrı bir paketimiz var . Bu Java SE 8 Tarih ve Saat belgesi hakkında iyi bir genel bakışa sahiptir.

Java 8'de aşağıdaki gibi bir şey işe yarayacaktır (geçerli tarihi / saati biçimlendirmek için),

LocalDateTime.now()
   .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

Ve dikkat edilmesi gereken bir şey, popüler üçüncü taraf kütüphanesi joda-time'ın yardımıyla geliştirildi ,

Proje, JSR 310 kapsamında Joda-Time (Stephen Colebourne) ve Oracle'ın yazarı tarafından ortaklaşa yürütülmüştür ve yeni Java SE 8 paketinde java.time'da yer alacaktır.

Ancak şimdi joda-timekullanımdan kaldırılıyor ve kullanıcılardan yeni ürünlere geçmelerini istedi java.time.

Java SE 8'den itibaren, kullanıcıların JDK'nın bu projenin yerini alan temel bir parçası olan java.time'a (JSR-310) geçmeleri gerektiğini unutmayın.

Her neyse, bunu söyledikten sonra,

Bir Takvim örneğiniz varsa, yeniye dönüştürmek için aşağıda kullanabilirsiniz java.time,

    Calendar calendar = Calendar.getInstance();
    long longValue = calendar.getTimeInMillis();         

    LocalDateTime date =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());
    String formattedString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(date.toString()); // 2018-03-06T15:56:53.634
    System.out.println(formattedString); // 2018-03-06 15:56:53.634

Bir Date nesneniz varsa,

    Date date = new Date();
    long longValue2 = date.getTime();

    LocalDateTime dateTime =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue2), ZoneId.systemDefault());
    String formattedString = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(dateTime.toString()); // 2018-03-06T15:59:30.278
    System.out.println(formattedString);     // 2018-03-06 15:59:30.278

Milisaniyeyi yeni geçirdiyseniz,

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());

minimum API düzeyi 26'dır
AbhinayMe

4

Yukarıdaki cevapları tamamlamak için, milisaniyeler dahil, geçerli saati ve tarihi yazdıran bir programın küçük bir çalışma örneği.

import java.text.SimpleDateFormat;
import java.util.Date;

public class test {
    public static void main(String argv[]){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date now = new Date();
        String strDate = sdf.format(now);
        System.out.println(strDate);
    }
}


2

Geçerli saatinizi belirtilen biçimde almak için bunu kullanın :

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }

Bilginize gibi korkunç zahmetli eski 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

Aslında bu çözümü Android Uygulaması için kullanıyordum, ancak Android'de Java.time sınıfını kullanmak için API'nın en az 27'ye ayarlanmış olması gerekir. Her neyse, bilgileri paylaştığınız için teşekkürler.
Abhishek Sengupta

Java.time işlevinin neredeyse tamamı, neredeyse aynı API ile ThreeTen-Backport projesinde Java 6 ve 7'ye geri taşınmıştır . Ayrıca ThreeTenABP projesinde Android <26'ya uyarlandı . Bu kanlı eski tarih-saat sınıflarına tekrar dokunmak için hiçbir neden yok.
Basil Bourque

2

Burada milisaniye ile tarih ve saati görüntülemek için basit bir örnek var ......

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class MyClass{

    public static void main(String[]args){
        LocalDateTime myObj = LocalDateTime.now();
        DateTimeFormatter myFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS);
        String forDate = myObj.format(myFormat);
        System.out.println("The Date and Time are: " + forDate);
    }
}

İyi görünüyor, ancak rsinha'nın 5 yaşındaki yorumu hakkında fikir veriyor mu?
greybeard


1

Ans:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
ZonedDateTime start = Instant.now().atZone(ZoneId.systemDefault());
String startTimestamp = start.format(dateFormatter);


0

java.text (java 8'den önce)

public static ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    };
};

...
dateFormat.get().format(new Date());

java.time

public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

...
dateTimeFormatter.format(LocalDateTime.now());

-1

İstediğiniz formatta elde edebilirsiniz.

String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));
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.