Jak uzyskać aktualny czas w formacie RRRR-MM-DD HH: MI: Sec.Millisecond w Javie?


641

Poniższy kod podaje mi aktualny czas. Ale nie mówi nic o milisekundach.

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

Dostaję datę w formacie 2009-09-22 16:47:08 (RRRR-MM-DD GG: MI: Sec) .

Ale chcę pobrać bieżący czas w formacie 2009-09-22 16:47:08.128((RRRR-MM-DD GG: MI: Sek. Ms) - gdzie 128 wskazuje milisekundę.

SimpleTextFormatbędzie dobrze działać. Tutaj najniższa jednostka czasu jest druga, ale jak mogę uzyskać milisekundę?


32
Gdy wszystko inne zawiedzie, przeczytaj dokumentację .
Hot Licks

4
FYI, kłopotliwego starych klas date-time, takie jak java.util.Date, java.util.Calendari java.text.SimpleTextFormatsą teraz spuścizny , wyparta przez java.time klas. Zobacz samouczek Oracle .
Basil Bourque

Odpowiedzi:


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

Z ciekawości, jakie korzyści przynosi użycie SimpleDateFormat po prostu: dateTime.ToString ("rrrr-MM-dd GG: mm: ss.SSS")?
NickG

10
@NickG Gdzie jest ta toString(String format)metoda? java.util.DateNie wydaje się to mieć. Masz na myśli interfejs API Joda Time? Ale jedną z możliwych korzyści jest ponowne użycie tego samego obiektu formatera. Innym jest to, że nie musisz dodawać API - klasa Date jest standardową klasą biblioteki Java.
ADTC

22
W Javie 8 możesz używać DateTimeFormatter w tym samym celu.
Vitalii Fedorenko

7
SimpleDateFormat nie jest bezpieczny dla wątków, ale nowszy DateTimeFormatter jest bezpieczny dla wątków.
devdanke

15
Korzystanie z interfejsu API Java 8 datetime:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha,

202

Jedna linijka Java

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

w stylu JDK8

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

9
LocalDateTime i DateTimeFormatter są bezpieczne dla wątków w przeciwieństwie do SimpleDateFormat
Maxple

@Maksymalizować przypadek, w którym SimpleDateFormat powoduje problemy?
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

W Javie 8 i nowszych mamy framework java.time wbudowany w Javę 8 i później. Te nowe klasy zastępują kłopotliwe stare klasy java.util.Date/.Calendar. Nowe klasy inspirowane są bardzo udanym frameworkiem Joda-Time , przeznaczonym jako jego następca, podobnym w koncepcji, ale przebudowanym. Zdefiniowane przez JSR 310 . Rozszerzony o projekt ThreeTen-Extra . Zobacz samouczek .

Należy pamiętać, że java.time jest zdolny do rozdzielczości nanosekundowej (9 miejsc dziesiętnych w ułamku sekundy), w porównaniu do rozdzielczości milisekundowej (3 miejsca dziesiętne) zarówno java.util.Date & Joda-Time. Dlatego podczas formatowania w celu wyświetlenia tylko 3 miejsc po przecinku możesz ukrywać dane.

Jeśli chcesz wyeliminować z danych jakieś mikrosekundy lub nanosekundy, obetnij.

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

Klasy java.time domyślnie używają formatu ISO 8601 podczas parsowania / generowania ciągów. A Zna końcu jest skrótem od Zului oznacza UTC .

An Instantreprezentuje moment na osi czasu w UTC z rozdzielczością do nanosekund . Uchwycenie bieżącego momentu w Javie 8 jest ograniczone do milisekund , a nowa implementacja w Javie 9 przechwytuje do nanosekund w zależności od możliwości zegara sprzętowego komputera.

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

2016-05-06T23: 24: 25.694Z

Zamień Tśrodek na spację, a na Znic, aby uzyskać pożądaną wydajność.

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

Ponieważ nie chcesz uwzględniać przesunięcia ani strefy czasowej, ustaw „lokalną” datę i czas niezwiązaną z żadną konkretną lokalizacją.

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

Joda-Time

Bardzo popularna biblioteka Joda-Time była inspiracją dla frameworku java.time. Zaleca się migrację do java.time, gdy jest to wygodne.

Format ISO 8601 obejmuje milisekundy i jest domyślny dla biblioteki Joda-Time 2.4.

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

Po uruchomieniu…

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

Możesz też poprosić o ułamek sekundy w milisekundach, jeśli to konieczne:

int millisOfSecond = myDateTime.getMillisOfSecond ();

9

Najłatwiejszym sposobem było (przed Java 8) użycie,

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

Ale SimpleDateFormat nie jest bezpieczny dla wątków. Ani java.util.Date . Doprowadzi to do potencjalnych problemów z współbieżnością dla użytkowników. I istnieje wiele problemów w tych istniejących projektach. Aby temu zaradzić teraz w Javie 8, mamy osobny pakiet o nazwie java.time . Ten dokument dotyczący daty i godziny Java SE 8 zawiera dobry przegląd.

Tak więc w Javie 8 coś takiego jak poniżej (aby sformatować bieżącą datę / godzinę),

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

I jedną rzeczą godną uwagi jest to, że został opracowany przy pomocy popularnej biblioteki joda-time ,

Projekt był prowadzony wspólnie przez autora Joda-Time (Stephen Colebourne) i Oracle, pod JSR 310, i pojawi się w nowym pakiecie Java SE 8 java.time.

Ale teraz joda-timestaje się przestarzałe i poprosił użytkowników o migrację do nowej java.time.

Należy pamiętać, że od wersji Java SE 8 użytkownicy są proszeni o migrację do java.time (JSR-310) - podstawowej części JDK, która zastępuje ten projekt

W każdym razie powiedziawszy to,

Jeśli masz instancję kalendarza, której możesz użyć poniżej, aby przekonwertować ją na nową 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

Jeśli miałeś obiekt Date,

    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

Jeśli masz epokę milisekund,

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

minimalny poziom API to 26
AbhinayMe


4

Aby uzupełnić powyższe odpowiedzi, oto mały działający przykład programu, który drukuje bieżącą godzinę i datę, w tym milisekundy.

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

Użyj tego, aby uzyskać swój aktualny czas w określonym formacie:

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

Do Twojej wiadomości, strasznie kłopotliwe stare klasy daty i czasu, takie jak java.util.Date, java.util.Calendari java.text.SimpleDateFormatsą teraz spuścizną , wyparte przez klasy java.time wbudowane w Javę 8 i nowsze wersje . Zobacz samouczek Oracle .
Basil Bourque,

Właściwie korzystałem z tego rozwiązania dla aplikacji na Androida, ale aby móc korzystać z klasy Java.time w systemie Android, musimy mieć ustawiony interfejs API na co najmniej 27. W każdym razie dzięki za udostępnienie informacji.
Abhishek Sengupta

Prawie wszystkie funkcje java.time są przeniesione z powrotem do Java 6 i 7 w projekcie ThreeTen-Backport z praktycznie takim samym API. Dalsze dostosowanie do Androida <26 w projekcie ThreeTenABP . Dlatego nie ma powodu, aby kiedykolwiek ponownie dotykać tych cholernych, okropnych, starych zajęć z randkami.
Basil Bourque

2

Mam tutaj prosty przykład do wyświetlania daty i godziny w Millisecond ......

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

Wygląda dobrze, ale czy dodaje wgląd w, powiedzmy, 5-letni komentarz rsinha ?
greybeard


1

Odp .:

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 (przed java 8)

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

Możesz po prostu pobrać go w żądanym formacie.

String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.