Руководство Java Date Time
1. Классы Date, time, calendar в Java
Java предоставляет некоторые классы связанные с временем и каледарем (Calendar), ниже перечислены эти классы:
Класс | Описание |
java.util.Date | Класс, представляющий дату и время. К сожалению большинство методов этого класса устарели, рекомендуется не использовать эти методы, при этом класс Date все еще широко используется. |
java.util.concurrent.TimeUnit | TimeUnit это Enum описывающий единицу даты и времени. |
java.sql.Date | Класс описывающий дату. Информация про время вырезано. Этот класс обычно используется в JDBC. |
java.sql.Time | Класс описывающий время (час, минута, секунда, милисекунда), и не содержит информацию о времени.Этот класс обычно используется в JDBC. |
java.sql.Timestamp | Класс описывающий дату и время. Этот класс обычно используется в JDBC. |
java.util.Calendar | Класс описывающий календарь. Имеет арифметические методы о времени, например добавить день, убавить день... |
java.util.GregorianCalendar | Это прямой подкласс java.util.Calendar, описывающий дату по Григорианскому календарю, календарь широко использующийся в наши дни. Он имеет все методы из java.util.Calendar, чтобы применить арифметику над датой и временем. |
java.util.TimeZone | TimeZone это класс описывающий часовой пояс, полезен когда вы работаете с Календарем на часовом поясе |
java.text.SimpleDateFormat | Этот класс помогает вам сменить String имеющий формат даты на вид Date и обратно. |
2. System.currentTimeMillis()
currentTimeMillis() это статистический метод класса System. Он возвращает количество времени в милисекундах от даты 1-1-1970 до настоящего времени.
System.currentTimeMillis() обычно используется для мерки количества времени выполнения определенного действия способом вызова этого метода перед тем как начать работать, и после завершения работы.
JobTimeDemo.java
package org.o7planning.tutorial.dt;
public class JobTimeDemo {
// Это метод суммирования всех чисел от 1 до 100.
private static int sum() {
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
return sum;
}
private static void doJob(int count) {
// Вызвать метод 'sum' с количеством раз данный параметром.
for (int i = 0; i < count; i++) {
sum();
}
}
public static void main(String[] args) {
long millis1 = System.currentTimeMillis();
doJob(10000);
long millis2 = System.currentTimeMillis();
long distance = millis2 - millis1;
System.out.println("Distance time in milli second: " + distance);
}
}
Результаты запуска примера:
Distance time in milli second: 3
3. TimeUnit
TimeUnit это Enum, был внесен начиная с Java5. Имеет некоторые методы конвертации между единицами времени, и дествительно полезны в некоторых ситуациях.
// Число минут.
int minute = 5;
// Конвертировать минуты в милисекунды.
// Это традиционный способ, который вы может использовали.
int millisecond = minute * 60 * 1000;
// Использовать TimeUnit:
long millisecond = TimeUnit.MINUTES.toMillis(minute);
Некоторые методы TimeUnit
// Конвертировать в наносекунды (nanoseconds).
public long toNanos(long d);
// Конвертировать в микросекунды (microseconds).
public long toMicros(long d);
// Конвертировать в милисекунды (milliseconds)
public long toMillis(long d);
// Конвертировать в секунды (seconds).
public long toSeconds(long d);
// Конвертировать в минуты (minutes).
public long toMinutes(long d);
// Конвертировать в часы (hours).
public long toHours(long d);
// Конвертировать в дни (days).
public long toDays(long d) ;
// Конвертировать в другую единицу времени, данный параметром 'u'.
public long convert(long d, TimeUnit u);
Пример:
TimeUnitConvertDemo.java
package org.o7planning.tutorial.timeunit;
import java.util.concurrent.TimeUnit;
public class TimeUnitConvertDemo {
public static void main(String[] args) {
// Секунды.
long second = 125553;
// Конвертировать секунды в минуты (Minute)
long minute = TimeUnit.MINUTES.convert(second, TimeUnit.SECONDS);
System.out.println("Minute " + minute);
// Конвертировать секунды выше в часы.
long hour = TimeUnit.HOURS.convert(second, TimeUnit.SECONDS);
System.out.println("Hour " + hour);
System.out.println("------");
// Конвертировать 3 дня в минуты.
minute = TimeUnit.DAYS.toMinutes(3);
System.out.println("Minute " + minute);
// Конвертировать 3 дня в часы.
hour = TimeUnit.DAYS.toHours(3);
System.out.println("Hour " + hour);
}
}
Результаты запуска примера:
Minute 2092
Hour 34
------
Minute 4320
Hour 72
4. java.util.Date
java.util.Date это один из первых классов описывающих даты в Java. К сожалению, почти все его методы устарели, вместо них используют метод java.util.Calendar. НО вы все еще можете использовать java.util.Date để для описания даты..
Только 2 конструктора (constructor) могут быть использованы:
// Создать объект Date описывающий текущее время.
Date date1 = new Date();
// Создать объект Date по времени как милисекунды считая от 1-1-1970.
long millis = .....;
Date date2 = new Date(millis);
DateDemo.java
package org.o7planning.tutorial.date;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class DateDemo {
public static void main(String[] args) throws InterruptedException {
// Создать объект Date описывающий текущее время.
Date date1 = new Date();
// Остановить на примерно 3 секунды.
Thread.sleep(TimeUnit.SECONDS.toMillis(3));
// Милисекунды с 01-01-1970 до настоящего времени.
long millis = System.currentTimeMillis();
Date date2 = new Date(millis);
// Сравнить 2 объекта date1 и date2.
// i < 0 значит date1 < date2
// i = 0 значит date1 = date2
// i > 0 значит date1 > date2
int i = date1.compareTo(date2);
System.out.println("date1 compareTo date2 = " + i);
// Проверить стоит ли date1 перед date2 или нет.
boolean before = date1.before(date2);
System.out.println("date1 before date2 ? " + before);
// Проверить стоит ли date1 после date2 или нет.
boolean after = date1.after(date2);
System.out.println("date1 after date2 ? " + after);
}
}
Результаты запуска примера:
date1 compareTo date2 = -1
date1 before date2 ? true
date1 after date2 ? false
5. Date, Time, Timestamp (java.sql)
java.sql имеет 3 класса связанные с датой и временем:
- java.sql.Date
- java.sql.Time
- java.sql.Timestamp
Конкретно:
- java.sql.Date соответствует с SQL DATE, значит он хранит год, месяц, день и пропускает часы, минуты, секунды, милисекунды. Так же, java.sql.Date не содержит информацию про часовой пояс.
- java.sql.Time соответствует с SQL TIME и содержит только информацию про часы, минуты, милисекунды.
- java.sql.Timestamp соответствует с SQL TIMESTAMP, он точный до наносекунды (заметьте, java.util.Date поддерживает только до милисекунд!) с кастомизированной точностью.
Классы выше использованные в PreparedStatement в JDBC API, например методы setDate, setTime, setTimestamp. Или могут быть получены из ResultSet.
6. java.util.Calendar
Резюме календаря:
Gregorian Calendar (Григорианский календарь): Это Солнечный календарь, или еще называется Христианский календарь, является мировым календарем. Он используется больше всего и назван в честь папой римским Григорием XIII, который ввел календарь в 1582 году.
Buddhist Calendar (Буддийский календарь): Это буддийский календарь, обычно используется в Юго Восточных странах, как Таиланд, Лаос, Камбоджа, и Шри Ланка. В настоящее время, этот календарь используется официально на будийских фестивалях. И нет страны, которая использует этот календарь официально, эти страны перешли на использование Григорианского календаря. Вы можете посмотреть дополнительную информацию здесь:
Japanese Imperial Calendar (Японский календарь): Это традиционный календарь Японии, в настоящее время Япония перешла на использование Григорианского календаря, при этом, традиционный календарь все еще используется неофициально.
Calendar это класс симулирующий систему Календаря.
Calendar имеет некоторые подклассы:
- GregorianCalendar
- JapaneseImperialCalendar
- BuddhistCalendar
Calendar это абстрактный календарь. Значит вы не можете создать его из конструктора (Constructor). При этом есть 2 статистических метода создать объект Calendar.
public static Calendar getInstance();
public static Calendar getInstance(TimeZone zone);
public static Calendar getInstance(Locale aLocale);
public static Calendar getInstance(TimeZone zone,Locale aLocale);
Пример:
// Создать объект Calendar описывающий текущее время.
// С Locale по умолчанию, и TimeZone (часовой пояс) по умолчанию
// (Работающего компьютера).
Calendar c = Calendar.getInstance();
Когда вы используете Calendar.getInstance(TimeZone,Locale) то получаете возвратом один из вышеупомянутых классов. В большинстве возвращают GregorianCalendar.
Вызов Calendar.getInstance() возвращает объект Calendar с параметромTimeZone соотвествующим вашему компьютеру и Locale по умолчанию.
Вызов Calendar.getInstance() возвращает объект Calendar с параметромTimeZone соотвествующим вашему компьютеру и Locale по умолчанию.
Посмотрите на код класса Calendar (JDK7):
Calendar (JDK7)
/**
* Gets a calendar using the default time zone and locale. The
* <code>Calendar</code> returned is based on the current time
* in the default time zone with the default locale.
*
* @return a Calendar.
*/
public static Calendar getInstance()
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(),
Locale.getDefault(Locale.Category.FORMAT));
cal.sharedZone = true;
return cal;
}
/**
* Gets a calendar using the specified time zone and default locale.
* The <code>Calendar</code> returned is based on the current time
* in the given time zone with the default locale.
*
* @param zone the time zone to use
* @return a Calendar.
*/
public static Calendar getInstance(TimeZone zone)
{
return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
}
/**
* Gets a calendar using the default time zone and specified locale.
* The <code>Calendar</code> returned is based on the current time
* in the default time zone with the given locale.
*
* @param aLocale the locale for the week data
* @return a Calendar.
*/
public static Calendar getInstance(Locale aLocale)
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), aLocale);
cal.sharedZone = true;
return cal;
}
/**
* Gets a calendar with the specified time zone and locale.
* The <code>Calendar</code> returned is based on the current time
* in the given time zone with the given locale.
*
* @param zone the time zone to use
* @param aLocale the locale for the week data
* @return a Calendar.
*/
public static Calendar getInstance(TimeZone zone,
Locale aLocale)
{
return createCalendar(zone, aLocale);
}
private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
Calendar cal = null;
String caltype = aLocale.getUnicodeLocaleType("ca");
if (caltype == null) {
// Calendar type is not specified.
// If the specified locale is a Thai locale,
// returns a BuddhistCalendar instance.
if ("th".equals(aLocale.getLanguage())
&& ("TH".equals(aLocale.getCountry()))) {
cal = new BuddhistCalendar(zone, aLocale);
} else {
cal = new GregorianCalendar(zone, aLocale);
}
} else if (caltype.equals("japanese")) {
cal = new JapaneseImperialCalendar(zone, aLocale);
} else if (caltype.equals("buddhist")) {
cal = new BuddhistCalendar(zone, aLocale);
} else {
// Unsupported calendar type.
// Use Gregorian calendar as a fallback.
cal = new GregorianCalendar(zone, aLocale);
}
return cal;
}
Некоторые важные методы:
Method get(int) | Return |
get(Calendar.DAY_OF_WEEK) | 1 (Calendar.SUNDAY) to 7 (Calendar.SATURDAY). |
get(Calendar.YEAR) | year |
get(Calendar.MONTH) | 0 (Calendar.JANUARY) to 11 (Calendar.DECEMBER). |
get(Calendar.DAY_OF_MONTH) | 1 to 31 |
get(Calendar.DATE) | 1 to 31 |
get(Calendar.HOUR_OF_DAY) | 0 to 23 |
get(Calendar.MINUTE) | 0 to 59 |
get(Calendar.SECOND) | 0 to 59 |
get(Calendar.MILLISECOND) | 0 to 999 |
get(Calendar.HOUR) | 0 to 11, to be used together with Calendar.AM_PM. |
get(Calendar.AM_PM) | 0 (Calendar.AM) or 1 (Calendar.PM). |
get(Calendar.DAY_OF_WEEK_IN_MONTH) | DAY_OF_MONTH 1 through 7 always correspond to DAY_OF_WEEK_IN_MONTH 1;
8 through 14 correspond to DAY_OF_WEEK_IN_MONTH 2, and so on. |
get(Calendar.DAY_OF_YEAR) | 1 to 366 |
get(Calendar.ZONE_OFFSET) | GMT offset value of the time zone. |
get(Calendar.ERA) | Indicate AD (GregorianCalendar.AD), BC (GregorianCalendar.BC). |
CalendarFieldsDemo.java
package org.o7planning.tutorial.calendar;
import java.util.Calendar;
public class CalendarFieldsDemo {
public static void main(String[] args) {
// Создть объект Calendar (календарь) по умолчанию.
// С time zone (часовой пояс) и locale по умолчанию.
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
// Возвращает значение от 0 - 11
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
int millis = c.get(Calendar.MILLISECOND);
System.out.println("Year: " + year);
System.out.println("Month: " + (month + 1));
System.out.println("Day: " + day);
System.out.println("Hour: " + hour);
System.out.println("Minute: " + minute);
System.out.println("Second: " + second);
System.out.println("Minute: " + minute);
System.out.println("Milli Second: " + millis);
}
}
Результаты запуска примера:
Year: 2021
Month: 5
Day: 15
Hour: 20
Minute: 34
Second: 52
Minute: 34
Milli Second: 382
Некоторые другие методы Calendar:
void set(int calendarField, int value)
void set(int year, int month, int date)
void set(int year, int month, int date, int hour, int minute, int second)
// Добавляет или убавляет период времени на поле (field) Calendar (Календаря).
// Основываясь на правилах Календаря.
void add(int field, int amount)
// Сворачивает (вверх/вниз) поле (field) в Calendar.
// roll(): Не влияет на другие поля Calendar.
void roll(int calendarField, boolean up)
// Прокручивает вверж (Roll up) поле в Calendar.
// roll(): Не влияет на другие поля Calendar.
void roll(int calendarField, int amount):
// Возвращает объект Date основываясь на значение Calendar.
Date getTime()
void setTime(Date date)
// Возвращает милисекунды данного объекта Calendar.
long getTimeInMills():
void setTimeInMillis(long millis)
void setTimeZone(TimeZone value)
CalendarDemo.java
package org.o7planning.tutorial.calendar;
import java.util.Calendar;
public class CalendarDemo {
public static void showCalendar(Calendar c) {
int year = c.get(Calendar.YEAR);
// Возвращает значение от 0 - 11
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
int millis = c.get(Calendar.MILLISECOND);
System.out.println(" " + year + "-" + (month + 1) + "-" + day //
+ " " + hour + ":" + minute + ":" + second + " " + millis);
}
public static void main(String[] args) {
// Создает объект Calendar, описывающий текущее время.
// С time zone (часовой пояс) и locale по умолчанию.
Calendar c = Calendar.getInstance();
System.out.println("First calendar info");
showCalendar(c);
// roll(..): Сворачивает поле (field) в Calendar.
// roll(..):Не меняет другие поля.
// Например: Сворачивает еще один час (boolean up = true)
c.roll(Calendar.HOUR_OF_DAY, true);
System.out.println("After roll 1 hour");
showCalendar(c);
// roll(..): Не меняет другие поля Calendar.
// Свернуть вниз на один час (boolean up = false)
c.roll(Calendar.HOUR_OF_DAY, false);
System.out.println("After roll -1 hour");
showCalendar(c);
// add(..): Может изменить другие поля в Calendar.
// Добавить час (boolean up = true)
c.add(Calendar.HOUR_OF_DAY, 1);
System.out.println("After add 1 hour");
showCalendar(c);
// roll(..): Не меняет другие поля Calendar.
// Свернуть 30 дней.
c.roll(Calendar.DAY_OF_MONTH, -30);
System.out.println("After roll -30 day");
showCalendar(c);
// add(..): Может изменить другие поля в Calendar.
// Добавить 30 дней.
c.add(Calendar.DAY_OF_MONTH, 30);
System.out.println("After add 30 day");
showCalendar(c);
}
}
Результаты запуска примера:
First calendar info
2021-5-15 20:35:27 395
After roll 1 hour
2021-5-15 21:35:27 395
After roll -1 hour
2021-5-15 20:35:27 395
After add 1 hour
2021-5-15 21:35:27 395
After roll -30 day
2021-5-16 21:35:27 395
After add 30 day
2021-6-15 21:35:27 395
7. Конвертация между Date и Calendar
- Date ==> Calendar
Date now = new Date();
Calendar c = Calendar.getInstance();
c.setTime(now);
- Calendar ==> Date
Calendar c = Calendar.getInstance();
Date date = c.getTime();
CalendarDateConversionDemo.java
package org.o7planning.tutorial.calendar;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class CalendarDateConversionDemo {
public static void showCalendar(Calendar c) {
int year = c.get(Calendar.YEAR);
// Возвращает значение от 0 - 11
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
int millis = c.get(Calendar.MILLISECOND);
System.out.println(year + "-" + (month + 1) + "-" + day //
+ " " + hour + ":" + minute + ":" + second + " " + millis);
}
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
// year, month, day
c.set(2000, 11, 24);
Date date = c.getTime();
System.out.println("Date " + date);
long timeInMillis = System.currentTimeMillis();
// Отнять 24 часа.
timeInMillis -= TimeUnit.HOURS.toMillis(24);
Date date2 = new Date(timeInMillis);
Calendar c2 = Calendar.getInstance();
c2.setTime(date2);
showCalendar(c2);
}
}
Результаты запуска примера:
Date Sun Dec 24 20:36:10 KGT 2000
2021-5-14 20:36:10 608
8. DateFormat & SimpleDateFormat
- Date ==> String
Date date = new Date();
DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
String dateString = df.format(date);
- String ==> Date
String dateString = "23/04/2005 23:11:59";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date date = df.parse(dateString);
DateFormatDemo.java
package org.o7planning.tutorial.dateformat;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatDemo {
public static void main(String[] args) throws ParseException {
final DateFormat df1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
String dateString1 = "23/04/2005 23:11:59";
System.out.println("dateString1 = " + dateString1);
// String ==> Date
Date date1 = df1.parse(dateString1);
System.out.println("date1 = " + date1);
final DateFormat df2 = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
// Date ==> String.
String dateString2 = df2.format(date1);
System.out.println("dateString2 = " + dateString2);
}
}
Результаты запуска примера:
dateString1 = 23/04/2005 23:11:59
date1 = Sat Apr 23 23:11:59 KGST 2005
dateString2 = 23-04-2005 23:11:59
Кастомизировать форматы Date, Time
Кастомизация формата Date. Посмотрим некоторые примеры форматов и возвращенные результаты.
Pattern | Output |
dd.MM.yy | 30.06.09 |
yyyy.MM.dd G 'at' hh:mm:ss z | 2009.06.30 AD at 08:29:36 PDT |
EEE, MMM d, ''yy | Tue, Jun 30, '09 |
h:mm a | 8:29 PM |
H:mm | 8:29 |
H:mm:ss:SSS | 8:28:36:249 |
K:mm a,z | 8:29 AM,PDT |
yyyy.MMMMM.dd GGG hh:mm aaa | 2009.June.30 AD 08:29 AM |
Шаблоны синтаксиса формата Date
Symbol | Meaning | Presentation | Example |
G | era designator | Text | AD |
y | year | Number | 2009 |
M | month in year | Text & Number | July & 07 |
d | day in month | Number | 10 |
h | hour in am/pm (1-12) | Number | 12 |
H | hour in day (0-23) | Number | 0 |
m | minute in hour | Number | 30 |
s | second in minute | Number | 55 |
S | millisecond | Number | 978 |
E | day in week | Text | Tuesday |
D | day in year | Number | 189 |
F | day of week in month | Number | 2 (2nd Wed in July) |
w | week in year | Number | 27 |
W | week in month | Number | 2 |
a | am/pm marker | Text | PM |
k | hour in day (1-24) | Number | 24 |
K | hour in am/pm (0-11) | Number | 0 |
z | time zone | Text | Pacific Standard Time |
' | escape for text | Delimiter | (none) |
' | single quote | Literal | ' |
- Java Date Time Format Pattern
Руководства Java Date Time
- Руководство Java ZoneId
- Руководство Java Temporal
- Руководство Java Period
- Руководство Java TemporalAdjusters
- Руководство Java MinguoDate
- Руководство Java TemporalAccessor
- Руководство Java JapaneseEra
- Руководство Java HijrahDate
- Руководство Java Date Time
- Что такое летнее время (DST)?
- Руководство Java LocalDate
- Руководство Java LocalTime
- Руководство Java ZonedDateTime
- Руководство Java JapaneseDate
- Руководство Java Duration
- Руководство Java TemporalQuery
- Руководство Java TemporalAdjuster
- Руководство Java ChronoUnit
- Руководство Java TemporalQueries
Show More
- Руководства Java Web Services
- Руководства Java Servlet/JSP
- Руководства JavaFX
- Руководства Java SWT
- Руководства Oracle Java ADF
- Java Basic
- Руководства Java Collections Framework
- Руководства Java IO
- Руководства Struts2 Framework
- Руководства Spring Boot
- Руководства Spring Cloud
- Руководства Maven
- Руководства Gradle