Szukaj…


Składnia

  • Date object = new Date();
  • Date object = new Date(long date);

Parametry

Parametr Wyjaśnienie
Brak parametru Tworzy nowy obiekt Date przy użyciu czasu alokacji (z dokładnością do milisekundy)
długa randka Tworzy nowy obiekt Date z czasem ustawionym na liczbę milisekund od „epoki” (1 stycznia 1970 r., 00:00:00 GMT)

Uwagi

Reprezentacja

Wewnętrznie obiekt Java Date jest reprezentowany jako długi; jest to liczba milisekund od określonego czasu (zwanego epoką ). Oryginalna klasa Java Date miała metody radzenia sobie ze strefami czasowymi itp., Ale były one przestarzałe na korzyść nowej wówczas klasy Kalendarz.

Jeśli więc wszystko, co chcesz zrobić w kodzie, to określony czas, możesz utworzyć klasę Date i zapisać ją itp. Jeśli chcesz wydrukować czytelną dla ludzi wersję tej daty, możesz jednak utworzyć klasę kalendarza i użyj jego formatowania, aby wygenerować godziny, minuty, sekundy, dni, strefy czasowe itp. Pamiętaj, że określona milisekunda jest wyświetlana jako różne godziny w różnych strefach czasowych; zwykle chcesz wyświetlać jedną w „lokalnej” strefie czasowej, ale metody formatowania muszą brać pod uwagę, że możesz chcieć wyświetlić ją dla innej.

Należy również pamiętać, że zegary używane przez maszyny JVM zwykle nie mają milisekundowej dokładności; zegar może „tykać” tylko co 10 milisekund, a zatem, jeśli mierzysz czas, nie możesz polegać na dokładnym pomiarze na tym poziomie.

Oświadczenie importowe

import java.util.Date;

Klasa Date może być importowana z pakietu java.util .

Uwaga

Instancje Date są zmienne, więc ich użycie może utrudnić pisanie kodu zabezpieczającego wątki lub może przypadkowo zapewnić dostęp do zapisu do stanu wewnętrznego. Na przykład w poniższej klasie metoda getDate() umożliwia programowi wywołującemu modyfikowanie daty transakcji:

public final class Transaction {
  private final Date date;

  public Date getTransactionDate() {
    return date;
  }
}

Rozwiązaniem jest albo zwrócenie kopii pola date lub użycie nowych interfejsów API w java.time wprowadzonych w Javie 8.

Większość metod konstruktorów w klasie Date została uznana za przestarzałą i nie należy jej używać. W prawie wszystkich przypadkach zaleca się stosowanie klasy Calendar do operacji na danych.

Java 8

Java 8 wprowadza nowy czas i datę API w pakiecie java.time , w tym LOCALDATE i Localtime . Klasy w pakiecie java.time zapewniają java.time interfejs API, który jest łatwiejszy w użyciu. Jeśli piszesz do Java 8, zdecydowanie zalecamy korzystanie z tego nowego interfejsu API. Zobacz Daty i czas (java.time. *) .

Tworzenie obiektów daty

Date date = new Date();
System.out.println(date); // Thu Feb 25 05:03:59 IST 2016

Tutaj ten obiekt Date zawiera bieżącą datę i godzinę utworzenia tego obiektu.

Calendar calendar = Calendar.getInstance();
calendar.set(90, Calendar.DECEMBER, 11);
Date myBirthDate = calendar.getTime();
System.out.println(myBirthDate); // Mon Dec 31 00:00:00 IST 1990

Obiekty Date najlepiej tworzyć za pomocą instancji Calendar ponieważ użycie konstruktorów danych jest przestarzałe i odradzane. Aby to zrobić, musimy uzyskać instancję klasy Calendar z metody fabrycznej. Następnie możemy ustawić rok, miesiąc i dzień miesiąca za pomocą liczb lub w przypadku stałych miesięcy pod warunkiem, że klasa Kalendarz poprawi czytelność i zmniejszy liczbę błędów.

calendar.set(90, Calendar.DECEMBER, 11, 8, 32, 35);
Date myBirthDatenTime = calendar.getTime();
System.out.println(myBirthDatenTime); // Mon Dec 31 08:32:35 IST 1990

Wraz z datą możemy również spędzać czas w kolejności godzin, minut i sekund.

Porównywanie obiektów daty

Kalendarz, data i data lokalna

Java SE 8

przed, po, porównajTo i równa się metodom

//Use of Calendar and Date objects    
final Date today = new Date();
final Calendar calendar = Calendar.getInstance();
calendar.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date birthdate = calendar.getTime();

final Calendar calendar2 = Calendar.getInstance();
calendar2.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date samebirthdate = calendar2.getTime();

//Before example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.before(birthdate)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", today, today, Boolean.valueOf(today.before(today)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.before(today)));

//After example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(birthdate)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(today)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.after(today)));

//Compare example
System.out.printf("Compare %1$tF to %2$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(birthdate)));
System.out.printf("Compare %1$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(today)));
System.out.printf("Compare %2$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(birthdate.compareTo(today)));

//Equal example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.equals(birthdate)));
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", birthdate, samebirthdate,
            Boolean.valueOf(birthdate.equals(samebirthdate)));
System.out.printf(
            "Because birthdate.getTime() -> %1$d is different from samebirthdate.getTime() -> %2$d, there are millisecondes!%n",
            Long.valueOf(birthdate.getTime()), Long.valueOf(samebirthdate.getTime()));

//Clear ms from calendars
calendar.clear(Calendar.MILLISECOND);
calendar2.clear(Calendar.MILLISECOND);
birthdate = calendar.getTime();
samebirthdate = calendar2.getTime();

System.out.printf("Is %1$tF equal to %2$tF after clearing ms? %3$b%n", birthdate, samebirthdate,
            Boolean.valueOf(birthdate.equals(samebirthdate)));
Java SE 8

isBefore, isAfter, CompareTo i równa się metodom

//Use of LocalDate
final LocalDate now = LocalDate.now();
final LocalDate birthdate2 = LocalDate.of(2012, 6, 30);
final LocalDate birthdate3 = LocalDate.of(2012, 6, 30);

//Hours, minutes, second and nanoOfsecond can also be configured with an other class LocalDateTime
//LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);

//isBefore example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(birthdate2)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(now)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isBefore(now)));

//isAfter example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(birthdate2)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(now)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isAfter(now)));

//compareTo example
System.out.printf("Compare %1$tF to %2$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(birthdate2)));
System.out.printf("Compare %1$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(now)));
System.out.printf("Compare %2$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(birthdate2.compareTo(now)));

//equals example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.equals(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.equals(birthdate3)));

//isEqual example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isEqual(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.isEqual(birthdate3)));

Porównanie dat przed Java 8

Przed wersją Java 8 daty można było porównywać za pomocą klas java.util.Calendar i java.util.Date . Klasa daty oferuje 4 metody porównywania dat:

after , before , metody compareTo i equals porównują wartości zwrócone przez metodę getTime () dla każdej daty.

Metoda compareTo zwraca dodatnią liczbę całkowitą.

  • Wartość większa niż 0: gdy data jest po argumencie data
  • Wartość większa niż 0: gdy data jest przed argumentem daty
  • Wartość jest równa 0: gdy Data jest równa argumentowi Data

wyniki equals mogą być zaskakujące, jak pokazano w przykładzie, ponieważ wartości, takie jak milisekundy, nie są inicjalizowane z tą samą wartością, jeśli nie zostaną podane wprost.

Od wersji Java 8

W Javie 8 nowy obiekt do pracy z Date jest dostępny java.time.LocalDate . LocalDate implementuje ChronoLocalDate , abstrakcyjną reprezentację daty, w której chronologię lub system kalendarza można podłączyć.

Aby mieć dokładność daty i godziny, należy użyć obiektu java.time.LocalDateTime . LocalDate i LocalDateTime używają tej samej nazwy metod do porównywania.

Porównywanie dat za pomocą LocalDate różni się od używania ChronoLocalDate ponieważ chronologia lub system kalendarza nie są brane pod uwagę jako pierwsze.

Ponieważ większość aplikacji powinna używać LocalDate , ChronoLocalDate nie jest uwzględniony w przykładach. Więcej informacji tutaj .

Większość aplikacji powinna deklarować podpisy metod, pola i zmienne jako LocalDate, a nie ten interfejs [ChronoLocalDate].

LocalDate ma 5 metod porównywania dat:

W przypadku LocalDate parametru isAfter , isBefore , isEqual , equals i compareTo teraz użyć tej metody:

int compareTo0(LocalDate otherDate) {
    int cmp = (year - otherDate.year);
    if (cmp == 0) {
        cmp = (month - otherDate.month);
        if (cmp == 0) {
            cmp = (day - otherDate.day);
        }
    }
    return cmp;
}

equals Sprawdzić metodę jeśli odniesienie parametr równy datę pierwszy natomiast isEqual bezpośrednio wywołuje compareTo0 .

W przypadku wystąpienia innej klasy ChronoLocalDate daty są porównywane przy użyciu Epoch Day . Liczba dni epoki to prosta inkrementująca liczba dni, w których dzień 0 to 1970-01-01 (ISO).

Konwertowanie daty na określony format ciągu

format() z klasy SimpleDateFormat pomaga przekonwertować obiekt Date na określony obiekt String , używając dostarczonego ciągu wzorca .

Date today = new Date();
    
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy"); //pattern is specified here
System.out.println(dateFormat.format(today)); //25-Feb-16 

Wzory można ponownie zastosować za pomocą applyPattern()

dateFormat.applyPattern("dd-MM-yyyy");
System.out.println(dateFormat.format(today)); //25-02-2016

dateFormat.applyPattern("dd-MM-yyyy HH:mm:ss E");
System.out.println(dateFormat.format(today)); //25-02-2016 06:14:33 Thu

Uwaga: tutaj mm (mała litera m) oznacza minuty, a MM (duża M) oznacza miesiąc. Podczas formatowania lat należy zachować ostrożność: duża litera „Y” ( Y ) oznacza „tydzień w roku”, a małe litery „y” ( y ) oznaczają rok.

Konwertowanie ciągu na datę

parse() z klasy SimpleDateFormat pomaga konwertować wzorzec String na obiekt Date .

DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
String dateStr = "02/25/2016"; // input String
Date date = dateFormat.parse(dateStr);
System.out.println(date.getYear()); // 116

Istnieją 4 różne style formatu tekstu: SHORT , MEDIUM (jest to ustawienie domyślne), LONG i FULL , z których każdy zależy od ustawień regionalnych. Jeśli nie określono żadnych ustawień narodowych, używane są domyślne ustawienia narodowe systemu.

Styl Locale.US Locale.France
KRÓTKI 30.06.09 30/06/09
ŚREDNI 30 czerwca 2009 r 30 czerwca 2009 r
DŁUGO 30 czerwca 2009 r 30 czerwca 2009 r
PEŁNY Wtorek, 30 czerwca 2009 r mardi 30 czerwca 2009

Podstawowy wynik daty

Używając następującego kodu z ciągiem formatu yyyy/MM/dd hh:mm.ss , otrzymamy następujące dane wyjściowe

2016/04/19 11: 45.36

// define the format to use
String formatString = "yyyy/MM/dd hh:mm.ss";

// get a current date object
Date date = Calendar.getInstance().getTime();

// create the formatter
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatString);

// format the date
String formattedDate = simpleDateFormat.format(date);

// print it
System.out.println(formattedDate);


// single-line version of all above code
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm.ss").format(Calendar.getInstance().getTime()));

Konwertuj sformatowaną reprezentację ciągu daty na obiekt Data

Tej metody można użyć do konwersji sformatowanego ciągu znaków reprezentującego datę na obiekt Date .

    /**
     * Parses the date using the given format.
     *
     * @param formattedDate the formatted date string
     * @param dateFormat the date format which was used to create the string.
     * @return the date
     */
    public static Date parseDate(String formattedDate, String dateFormat) {
        Date date = null;
        SimpleDateFormat objDf = new SimpleDateFormat(dateFormat);
        try {
          date = objDf.parse(formattedDate);
        } catch (ParseException e) {
          // Do what ever needs to be done with exception.
        }
        return date;
    }

Tworzenie konkretnej daty

Chociaż klasa Java Date ma kilka konstruktorów, zauważysz, że większość z nich jest przestarzała. Jedynym dopuszczalnym sposobem bezpośredniego utworzenia instancji Date jest użycie pustego konstruktora lub przekazanie długiej (liczba milisekund od standardowego czasu bazowego). Żadne z nich nie jest przydatne, chyba że szukasz bieżącej daty lub nie masz już innej instancji Date.

Aby utworzyć nową datę, potrzebujesz instancji Kalendarza. Stamtąd możesz ustawić instancję kalendarza na potrzebną datę.

Calendar c = Calendar.getInstance();

Zwraca to nową instancję kalendarza ustawioną na bieżącą godzinę. Kalendarz ma wiele metod modyfikowania daty i godziny lub ustawiania go wprost. W takim przypadku ustawimy na określoną datę.

c.set(1974, 6, 2, 8, 0, 0);
Date d = c.getTime();

Metoda getTime zwraca potrzebną nam instancję Date. Należy pamiętać, że metody ustawiania kalendarza ustawiają tylko jedno lub więcej pól, nie ustawiają ich wszystkich. Oznacza to, że jeśli ustawisz rok, pozostałe pola pozostaną niezmienione.

PUŁAPKA

W wielu przypadkach ten fragment kodu spełnia swoje zadanie, ale należy pamiętać, że dwie ważne części daty / godziny nie są zdefiniowane.

  • parametry (1974, 6, 2, 8, 0, 0) są interpretowane w domyślnej strefie czasowej, zdefiniowanej gdzie indziej,
  • milisekundy nie są ustawione na zero, ale są wypełniane z zegara systemowego w momencie tworzenia instancji Kalendarza.

Java 8 LocalDate i LocalDateTime

Obiekty Date i LocalDate nie mogą być dokładnie konwertowane między sobą, ponieważ obiekt Date reprezentuje zarówno określony dzień i godzinę, podczas gdy obiekt LocalDate nie zawiera informacji o czasie ani strefie czasowej. Przydaje się jednak konwersja między nimi, jeśli zależy Ci tylko na rzeczywistej informacji o dacie, a nie o godzinie.

Tworzy datę lokalną

// Create a default date
LocalDate lDate = LocalDate.now();

// Creates a date from values
lDate = LocalDate.of(2017, 12, 15);
    
// create a date from string
lDate = LocalDate.parse("2017-12-15");

// creates a date from zone
LocalDate.now(ZoneId.systemDefault());

Tworzy LocalDateTime

// Create a default date time
LocalDateTime lDateTime = LocalDateTime.now();

// Creates a date time from values
lDateTime = LocalDateTime.of(2017, 12, 15, 11, 30);

// create a date time from string
lDateTime = LocalDateTime.parse("2017-12-05T11:30:30");

// create a date time from zone 
LocalDateTime.now(ZoneId.systemDefault());

Data lokalna do daty i odwrotnie

Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();

// Date to LocalDate
LocalDate localDate = date.toInstant().atZone(defaultZoneId).toLocalDate();

// LocalDate to Date
Date.from(localDate.atStartOfDay(defaultZoneId).toInstant());

LocalDateTime to Date i odwrotnie

Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();

// Date to LocalDateTime
LocalDateTime localDateTime =  date.toInstant().atZone(defaultZoneId).toLocalDateTime();

// LocalDateTime to Date
Date out = Date.from(localDateTime.atZone(defaultZoneId).toInstant());

Strefy czasowe i java.util.Date

Obiekt java.util.Date nie ma pojęcia strefy czasowej.

  • Nie ma możliwości ustawienia strefy czasowej dla daty
  • Nie ma możliwości zmiany strefy czasowej obiektu Date
  • Obiekt Date utworzony za pomocą new Date() domyślnego konstruktora new Date() zostanie zainicjowany z bieżącą godziną w domyślnej strefie czasowej systemu

Można jednak wyświetlić datę reprezentowaną przez moment w czasie opisany przez obiekt Date w innej strefie czasowej, używając np. java.text.SimpleDateFormat :

Date date = new Date();
//print default time zone
System.out.println(TimeZone.getDefault().getDisplayName());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //note: time zone not in format!
//print date in the original time zone
System.out.println(sdf.format(date));
//current time in London
sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(sdf.format(date));

Wynik:

Central European Time
2016-07-21 22:50:56
2016-07-21 21:50:56

Konwertuj java.util.Date na java.sql.Date

Konwersja java.util.Date na java.sql.Date jest zwykle konieczna, gdy obiekt Data musi zostać zapisany w bazie danych.

java.sql.Date jest opakowaniem wokół wartości milisekundowej i jest używana przez JDBC do identyfikacji typu SQL DATE

W poniższym przykładzie używamy konstruktora java.util.Date() , który tworzy obiekt Date i inicjuje go, aby reprezentował czas z dokładnością do milisekundy. Ta data jest używana w metodzie convert(java.util.Date utilDate) do zwrócenia obiektu java.sql.Date

Przykład

public class UtilToSqlConversion {
    
    public static void main(String args[])
    {
        java.util.Date utilDate = new java.util.Date();
        System.out.println("java.util.Date is : " + utilDate);
        java.sql.Date sqlDate = convert(utilDate);
        System.out.println("java.sql.Date is : " + sqlDate);
        DateFormat df = new SimpleDateFormat("dd/MM/YYYY - hh:mm:ss");
        System.out.println("dateFormated date is : " + df.format(utilDate));
    }

    private static java.sql.Date convert(java.util.Date uDate) {
        java.sql.Date sDate = new java.sql.Date(uDate.getTime());
        return sDate;
    }

}

Wynik

java.util.Date is : Fri Jul 22 14:40:35 IST 2016
java.sql.Date is : 2016-07-22
dateFormated date is : 22/07/2016 - 02:40:35

java.util.Date zawiera zarówno datę, jak i godzinę, podczas gdy java.sql.Date ma tylko informacje o dacie

Czas lokalny

Aby użyć tylko części czasu z Data, użyj LocalTime. Możesz utworzyć obiekt LocalTime na kilka sposobów

  1. LocalTime time = LocalTime.now();
  2. time = LocalTime.MIDNIGHT;
  3. time = LocalTime.NOON;
  4. time = LocalTime.of(12, 12, 45);

LocalTime ma również wbudowaną metodę toString, która bardzo ładnie wyświetla format.

System.out.println(time); 

możesz także pobierać, dodawać i odejmować godziny, minuty, sekundy i nanosekundy od obiektu LocalTime, tj

time.plusMinutes(1);
time.getMinutes();
time.minusMinutes(1);

Możesz go przekształcić w obiekt Date o następującym kodzie:

LocalTime lTime = LocalTime.now();
Instant instant = lTime.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
        atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);

klasa ta działa bardzo dobrze w klasie timera, symulując budzik.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow