2011-12-01 9 views
48

muszę uzyskać aktualny timestamp w Javie, z formatem MM/DD/YYYY h:mm:ss AM/PM,potrzebna, aby uzyskać aktualny timestamp w Javie

Na przykład: 06/01/2000 10:01:50 AM

muszę go mieć THREADSAFE również.

Czy mogę wykorzystać coś takiego?

java.util.Date date = new java.util.Date(); 
System.out.println(new Timestamp(date.getTime())); 

Albo przykłady omówione w linku here.

+2

Jeśli tworzysz SimpleDateFormat w zakresie sposobu będzie to threadsafe ... – willcodejavaforfood

+0

Dziękuję za wejście i wyjaśnienie tej kwestii. – user717236

Odpowiedz

69

Wątek bezpieczeństwa z SimpleDateFormat nie powinien stanowić problemu, jeśli po prostu utworzysz go w tym samym bloku metod, co z niego korzystasz. Innymi słowy, jesteś nie przypisywanie go jako statycznej lub instancji zmiennej klasy i ponowne wykorzystanie go w jednej lub wielu metod, które mogą być wywoływane przez wiele wątków. Tylko w ten sposób zostanie ujawniony błąd bezpieczeństwa SimpleDateFormat. Można jednak bezpiecznie ponownie użyć tej samej instancji SimpleDateFormat w tym samym bloku metod, w jaki byłby dostępny tylko bieżący wątek.

Również klasa java.sql.Timestamp którego używasz nie powinno być nadużywane, jak to specyficzne dla API JDBC, aby być w stanie przechowywać lub pobrać TIMESTAMP/DATETIME typ kolumny w bazie danych SQL i przekształcić ją z/do java.util.Date.

Tak, należy to zrobić:

Date date = new Date(); 
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a"); 
String formattedDate = sdf.format(date); 
System.out.println(formattedDate); // 12/01/2011 4:48:16 PM 
+1

Dziękuję za pomoc. To działało, dziękuję! Doceniam twoje szczegółowe i zwięzłe sprawozdanie na temat bezpieczeństwa wątków w odniesieniu do SimpleDateFormat. Jesteś w widoku na znaczniku czasu, używaj go wyłącznie do SQL. To ma sens. Dziękuję za twoją mądrość. – user717236

+3

Nie ma za co. – BalusC

+1

Chciałem tylko powiedzieć, że zapomniałeś dwukropka w drugiej linii. To bardzo drobny błąd; po prostu sprawia, że ​​kopiowanie i wklejanie jest trochę bardziej niewygodne. – deinocheirus

5

fakt, że SimpleDateFormat nie jest bezpieczny wątku nie oznacza, że ​​nie można go używać. Co oznacza tylko, że nie wolno używać pojedynczej instancji (potencjalnie, ale niekoniecznie static), do której dostęp uzyskuje się z kilku wątków naraz.

Zamiast tego po prostu upewnij się, że dla każdego wątku utworzono świeżą SimpleDateFormat. Instancje utworzone jako zmienne lokalne w metodzie są bezpieczne z definicji, ponieważ nie można ich uzyskać z żadnych współbieżnych wątków.

Możesz może chcesz rzucić okiem na klasę ThreadLocal, choć zaleca się, aby po prostu utworzyć nową instancję, gdziekolwiek potrzebujesz. Oczywiście można zdefiniować format definicji jako static final String DATE_FORMAT_PATTERN = "..."; i użyć go dla każdej nowej instancji.

+0

Chciałbym również dać ci znacznik wyboru, tak jak na to zasługujesz. Twoja wiedza na ten temat jest nieoceniona dla mnie i dla innych, którzy przeczytają to pytanie. Dziękuję bardzo za poświęcony czas i pomoc. – user717236

0
String.format("{0:dddd, MMMM d, yyyy hh:mm tt}", dt); 
+0

Dziękuję za pomoc. Niestety to nie zadziałało. Wystąpił błąd "Metoda Format (String, Date) jest niezdefiniowana dla typu String". Oczekuje typu obiektu, a nie typu daty. – user717236

+3

Spróbuj użyć małej litery "f" dla String.format (...). Nazwy metod w Javie zaczynają się od małej litery według konwencji. –

+1

Dziękuję bardzo. Próbowałem String str = String.format ("{0: dddd, MMMM d, yyyy gg: mm tt}", new Date()); a str przyjmuje wartość {0: dddd, MMMM d, rrrr gg: mm tt}. Oznacza to, że nie działa. – user717236

7

Spróbuj jedno rozwiązanie linia:

import java.util.Date; 
String timestamp = 
    new java.text.SimpleDateFormat("MM/dd/yyyy h:mm:ss a").format(new Date()); 
+0

To działa. Napisanie więcej niż jednej linii do zrobienia czegoś takiego wydaje się śmieszne w nowoczesnym języku. –

+0

@AndrewCowenhoven To więcej niż 1 linia. : D – Andrew

1

Joda-Time

Oto ten sam rodzaj kodu, ale z wykorzystaniem biblioteki innej firmy Joda-Time 2.3.

W prawdziwym życiu określilibyśmy time zone, ponieważ poleganie na strefie domyślnej jest zwykle złą praktyką. Ale pominięto tutaj dla uproszczenia przykładu.

org.joda.time.DateTime now = new DateTime(); 
org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern("MM/dd/yyyy h:mm:ss a"); 
String nowAsString = formatter.print(now); 

System.out.println("nowAsString: " + nowAsString); 

Po uruchomieniu ...

nowAsString: 11/28/2013 11:28:15 PM 
13

Drukuj znacznik czasu w Javie, używając java.sql.Timestamp.

import java.sql.Timestamp; 
import java.util.Date; 

public class GetCurrentTimeStamp { 
    public static void main(String[] args){ 
     java.util.Date date= new java.util.Date(); 
     System.out.println(new Timestamp(date.getTime())); 
    } 
} 

Drukuje:

2014-08-07 17:34:16.664 

wydrukować Datownik w Javie przy użyciu SimpleDateFormat na jednej liniowej.

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

class Runner{ 
    public static void main(String[] args){ 

     System.out.println(
      new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new Date())); 

    } 

} 

Wydruki:

08/14/2014 14:10:38 

Java format daty legenda:

G Era designation  Text    AD 
y Year     Year    1996; 96 
M Month in year  Month    July; Jul; 07 
w Week in year   Number    27 
W Week in month  Number    2 
D Day in year   Number    189 
d Day in month   Number    10 
F Day of week in month Number    2 
E Day in week   Text    Tuesday; Tue 
a Am/pm marker   Text    PM 
H Hour in day (0-23) Number    0 
k Hour in day (1-24) Number    24 
K Hour in am/pm (0-11) Number    0 
h Hour in am/pm (1-12) Number    12 
m Minute in hour  Number    30 
s Second in minute  Number    55 
S Millisecond   Number    978 
z Time zone   General time zone Pacific Standard Time; PST; GMT-08:00 
Z Time zone   RFC 822 time zone -0800 
+0

ładne wyjaśnienie! – hnvasa

3

java.time

Jako Java 8+ można użyć java.time package. W szczególności, należy użyć DateTimeFormatterBuilder i DateTimeFormatter, aby sformatować wzory i literały.

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
     .appendPattern("MM").appendLiteral("/") 
     .appendPattern("dd").appendLiteral("/") 
     .appendPattern("yyyy").appendLiteral(" ") 
     .appendPattern("hh").appendLiteral(":") 
     .appendPattern("mm").appendLiteral(":") 
     .appendPattern("ss").appendLiteral(" ") 
     .appendPattern("a") 
     .toFormatter(); 
System.out.println(LocalDateTime.now().format(formatter)); 

Wyjście ...

06/22/2015 11:59:14 AM 

Albo jeśli chcesz inny time zone ...

// system default 
System.out.println(formatter.withZone(ZoneId.systemDefault()).format(Instant.now())); 
// Chicago 
System.out.println(formatter.withZone(ZoneId.of("America/Chicago")).format(Instant.now())); 
// Kathmandu 
System.out.println(formatter.withZone(ZoneId.of("Asia/Kathmandu")).format(Instant.now())); 

Wyjście ...

06/22/2015 12:38:42 PM 
06/22/2015 02:08:42 AM 
06/22/2015 12:53:42 PM 
+0

Możemy również użyć 'DateTimeFormatter.ofPattern (" MM/dd/rrrr gg: mm: ss a ")', aby uzyskać wystąpienie DateTimeFormatter :) – Arkantos

1

Zrobiłem to tak kiedy chciałem tmiestamp

String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime()); 

Nadzieja to pomaga :) Jako początkujących Myślę, że to oczywiste

myślę, że trzeba także import java.text.SimpleDateFormat; header go do pracy :))

1

Można skorzystać z java.util.Date z formatem bezpośredniego:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date()); 
0

dobrze czasami ta jest również przydatna.

import java.util.Date; 
public class DisplayDate { 
public static void main(String args[]) { 
    // Instantiate an object 
    Date date = new Date(); 

    // display time and date 
    System.out.println(date.toString());}} 

wyjście próbki:Mon Jul 03 19:07:15 IST 2017