Jak przekonwertować aktualną datę na ciąg znaków w Javie?


Odpowiedzi:



62
// GET DATE & TIME IN ANY FORMAT
import java.util.Calendar;
import java.text.SimpleDateFormat;
public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";

public static String now() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return sdf.format(cal.getTime());
}

Zaczerpnięte stąd


Najlepsza odpowiedź za użycie kalendarza zamiast daty.
Losowo

5
Jestem zmieszany. W jakim wszechświecie jest Calendarbardziej pożądane niż Date?
jasonmp85

1
FYI, te kłopotliwe klasy są teraz starsze, wyparte przez klasy java.time. Zobacz samouczek Oracle .
Basil Bourque

27
// On the form: dow mon dd hh:mm:ss zzz yyyy
new Date().toString();

58
Przepraszam za przesadne osiągnięcia.
jasonmp85

2
Format używany przez tę metodę jest okropny. Ponadto domyślna strefa czasowa KVM jest domyślnie stosowana, więc wyniki będą się różnić. Te kłopotliwe klasy są teraz starsze, wyparte przez klasy java.time. Zobacz samouczek Oracle .
Basil Bourque


14

tl; dr

LocalDate.now()
         .toString() 

2017-01-23

Lepiej jest jawnie określić żądaną / oczekiwaną strefę czasową.

LocalDate.now( ZoneId.of( "America/Montreal" ) )
         .toString() 

java.time

Nowoczesnym sposobem, począwszy od Java 8 i późniejszych, jest framework java.time .

Określ strefę czasową, ponieważ data zmienia się w dowolnym momencie na całym świecie.

ZoneId zoneId = ZoneId.of( "America/Montreal" ) ;  // Or ZoneOffset.UTC or ZoneId.systemDefault()
LocalDate today = LocalDate.now( zoneId ) ;
String output = today.toString() ;

2017-01-23

Domyślnie otrzymujesz ciąg w standardowym formacie ISO 8601 .

W przypadku innych formatów użyj java.time.format.DateTimeFormatterklasy.


Informacje o java.time

Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, i SimpleDateFormat.

Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .

Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*klas.

Skąd wziąć klasy java.time?

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .



1

Na czas w formacie RRRR-MM-dd

String time = new DateTime( yourData ).toString("yyyy-MM-dd");

Biblioteka DateTime to:

import org.joda.time.DateTime;


A z jakiej biblioteki pochodzi DateTime? Odpowiedź na przepełnienie stosu powinna zawierać pewne wyjaśnienie, ponieważ ta witryna ma być czymś więcej niż biblioteką fragmentów.
Basil Bourque

0

Większość odpowiedzi jest / była poprawna. Nowa modyfikacja API JAVA do obsługi dat zapewniła, że ​​niektóre wcześniejsze niejasności w obsłudze dat w Javie zostały zredukowane.

W przypadku podobnych połączeń otrzymasz przestarzały komunikat.

new Date() // deprecated

Powyższe wywołanie spowodowało, że programista założył, że nowy obiekt Date da obiekt Date z aktualnym znacznikiem czasu. To zachowanie nie jest spójne w innych klasach interfejsu API języka Java.

Nowym sposobem na to jest użycie wystąpienia kalendarza .

new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()

Tutaj również konwencja nazewnictwa nie jest doskonała, ale jest bardzo zorganizowana. Dla osoby takiej jak ja, która ma trudności z kradzieżą rzeczy, ale nigdy by czegoś nie zapomniała, jeśli brzmi / wydaje się logiczne, jest to dobre podejście.

To jest bardziej synonimem prawdziwego życia

  1. Otrzymujemy obiekt Calendar i szukamy w nim czasu. (pewnie się zastanawiasz, nikt nie ma czasu z Kalendarza, dlatego powiedziałem, że nie jest idealny, ale to zupełnie inny temat)
  2. Następnie chcemy mieć datę w prostym formacie tekstowym, więc używamy klasy narzędziowej SimpleDateFormat, która pomaga nam w formatowaniu daty z kroku 1. Jako parametry w formacie użyłem rrrr, MM, dd. Obsługiwane parametry formatu daty

Jeszcze jednym sposobem jest użycie interfejsu API czasu Joda

new DateTime().toString("yyyy-MM-dd")

lub bardziej oczywiste

new DateTime(Calendar.getInstance().getTime()).toString("yyyy-MM-dd")

oba zwrócą ten sam wynik.


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. Ponadto projekt Joda-Time jest teraz w trybie konserwacji , a zespół zaleca migrację do java.time.
Basil Bourque

1
@BasilBourque To właśnie miałem na myśli w mojej odpowiedzi, że odpowiedź najczęściej głosowana jest poprawna, ale nie ma znaczenia dla współczesnego programisty. Wreszcie java będzie miała klasę Clock, a Clock.getTime () będzie dużo bardziej rozsądne i naśladujące rzeczywiste życie niż klasy Date, DateTime lub Time. Programiści Java muszą wiedzieć, że OOPS zaczęło się od czegoś, co imituje scenariusze z życia.
Swapnil Vargaonkar

FYI, Clockimplementacja w Javie 8 jest dokładnie taka sama, jak w starszych klasach. Dopiero w Javie 9 pojawia się nowa implementacja, zdolna do przechwytywania aktualnego momentu z rozdzielczością rzędu nanosekund.
Basil Bourque

Tak, to jest powód, dla którego napisałem "w końcu" Java będzie miała klasę Clock, która będzie naśladować scenariusz z prawdziwego życia (koncepcja OOPS) i pokaże / uchwyci (tak jak wolisz) aktualny moment.
Swapnil Vargaonkar

-2
public static Date getDateByString(String dateTime) {
        if(dateTime==null || dateTime.isEmpty()) {
            return null;
        }
        else{
            String modified = dateTime + ".000+0000";
            DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
            Date dateObj = new Date();
            Date dateObj1 = new Date();
            try {
                if (dateTime != null) {
                    dateObj = formatter.parse(modified);
                }

            } catch (ParseException e) {
                e.printStackTrace();
            }

            return dateObj;
        }

    }

1
Pewne wyjaśnienia dotyczące tego fragmentu kodu byłyby prawdopodobnie przydatne.
Pyves

1
Odpowiedź nie ma związku z pytaniem. I nie, nie możesz przekazać daty w żadnym Stringformacie do swojej funkcji.
Jerin Joseph
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.