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.