Java Language
Klasa daty
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
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)));
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:
- isAfter (ChronoLocalDate inne)
- isBefore (ChronoLocalDate inne)
- isEqual (ChronoLocalDate inne)
- CompareTo (ChronoLocalDate other)
- równa się (Object obj)
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 konstruktoranew 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
-
LocalTime time = LocalTime.now();
-
time = LocalTime.MIDNIGHT;
-
time = LocalTime.NOON;
-
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.