betacode

Руководство Java Date Time

  1. Классы Date, time, calendar в Java
  2. System.currentTimeMillis()
  3. TimeUnit
  4. java.util.Date
  5. Date, Time, Timestamp (java.sql)
  6. java.util.Calendar
  7. Конвертация между Date и Calendar
  8. DateFormat & SimpleDateFormat

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 (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