Java Language
Класс даты
Поиск…
Синтаксис
-
Date object = new Date();
-
Date object = new Date(long date);
параметры
параметр | объяснение |
---|---|
Нет параметров | Создает новый объект Date с использованием времени выделения (до ближайшей миллисекунды) |
длительная дата | Создает новый объект Date с временем, установленным на миллисекунды с «эпохи» (1 января 1970 года, 00:00:00 GMT) |
замечания
Представление
Внутренне объект Java Date представлен как длинный; это число миллисекунд с определенного времени (называемое эпохой ). У исходного класса Java Date были методы для работы с часовыми поясами и т. Д., Но они были устаревшими в пользу нового класса Calendar.
Поэтому, если все, что вы хотите сделать в своем коде, представляет определенное время, вы можете создать класс Date и сохранить его и т. Д. Однако, если вы хотите распечатать человекочитаемую версию этой даты, вы создаете класс Calendar и использовать его форматирование для создания часов, минут, секунд, дней, часовых поясов и т. д. Имейте в виду, что конкретная миллисекунда отображается как разные часы в разных часовых поясах; обычно вы хотите отображать его в «локальном» часовом поясе, но методы форматирования должны учитывать, что вы можете отобразить его для какого-либо другого.
Также имейте в виду, что часы, используемые JVM, обычно не имеют миллисекундной точности; часы могут «гасить» каждые 10 миллисекунд, и поэтому, если вы делаете тактику времени, вы не можете полагаться на точные измерения на этом уровне.
Импортный отчет
import java.util.Date;
Класс Date
может быть импортирован из пакета java.util
.
предосторожность
Экземпляры Date
изменяемы, поэтому их использование может затруднить запись потокобезопасного кода или может случайно предоставить доступ на запись во внутреннее состояние. Например, в классе ниже метод getDate()
позволяет вызывающему пользователю изменить дату транзакции:
public final class Transaction {
private final Date date;
public Date getTransactionDate() {
return date;
}
}
Решение состоит в том, чтобы либо вернуть копию поля date
либо использовать новые API в java.time
введенные в Java 8.
Большинство методов конструктора в классе Date
устарели и не должны использоваться. Практически во всех случаях рекомендуется использовать класс Calendar
для операций с датой.
Java 8
Java 8 вводит новый API времени и даты в пакет java.time
, включая LocalDate и LocalTime . Классы в пакете java.time
предоставляют переработанный API, который проще в использовании. Если вы пишете на Java 8, настоятельно рекомендуется использовать этот новый API. См. « Даты и время» (java.time. *) .
Создание объектов Date
Date date = new Date();
System.out.println(date); // Thu Feb 25 05:03:59 IST 2016
Здесь этот объект Date
содержит текущую дату и время создания этого объекта.
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
Объекты Date
лучше всего создавать с помощью экземпляра Calendar
поскольку использование конструкторов данных устарело и не рекомендуется. Для этого нам нужно получить экземпляр класса Calendar
из заводского метода. Затем мы можем установить год, месяц и день месяца, используя числа или в случае месячных констант, предоставленных классу Calendar для повышения удобочитаемости и уменьшения ошибок.
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
Наряду с датой мы также можем пропустить время в часах, минутах и секундах.
Сравнение объектов Date
Календарь, дата и локальная дата
до, после, compareTo и equals методы
//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 и equals методы
//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)));
Сравнение даты перед Java 8
До Java 8 даты можно было сравнить с помощью классов java.util.Calendar и java.util.Date . Класс Date предлагает 4 метода сравнения дат:
after
, before
, compareTo
и equals
сравнивают значения, возвращаемые методом getTime () для каждой даты.
Метод compareTo
возвращает положительное целое число.
- Значение больше 0: когда Date после аргумента Date
- Значение больше 0: когда дата предшествует аргументу Date
- Значение равно 0: когда Date равно аргументу Date
equals
результаты могут быть неожиданными, как показано в примере, потому что значения, такие как миллисекунды, не инициализируются с тем же значением, если явно не указано.
Поскольку Java 8
С Java 8 доступен новый объект для работы с датой java.time.LocalDate . LocalDate
реализует ChronoLocalDate , абстрактное представление даты, в которой хронология или система календаря подключается.
Чтобы иметь точность даты даты, необходимо использовать объект java.time.LocalDateTime . LocalDate
и LocalDateTime
используют LocalDate
и то же имя метода для сравнения.
Сравнение дат с использованием LocalDate
отличается от использования ChronoLocalDate
потому что хронология или система календаря не учитываются в первом.
Поскольку большинство приложений должны использовать LocalDate
, ChronoLocalDate
не включен в примеры. Далее читайте здесь .
Большинство приложений должны объявлять сигнатуры методов, поля и переменные как LocalDate, а не этот интерфейс [ChronoLocalDate].
LocalDate
имеет 5 методов для сравнения дат:
- isAfter (ChronoLocalDate другой)
- isBefore (ChronoLocalDate другой)
- isEqual (ChronoLocalDate другой)
- compareTo (ChronoLocalDate другой)
- equals (Object obj)
В случае параметра LocalDate
, isAfter
, isBefore
, isEqual
, equals
и compareTo
теперь используют этот метод:
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
method проверяет, соответствует ли значение параметра первой дате, тогда как isEqual
напрямую вызывает compareTo0
.
В случае другого экземпляра класса ChronoLocalDate
даты сравниваются с использованием дня Epoch Day
. Количество дней Epoch Day - это простое увеличение количества дней, в которых день 0 равен 1970-01-01 (ISO).
Преобразование даты в определенный формат String
format()
из класса SimpleDateFormat
помогает преобразовать объект Date
в определенный объект String
формата, используя прилагаемую строку шаблона .
Date today = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy"); //pattern is specified here
System.out.println(dateFormat.format(today)); //25-Feb-16
Шаблоны можно снова применить с помощью 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
Примечание: Здесь mm
(малая буква m) обозначает минуты, а MM
(капитал M) обозначает месяц. Обращайте пристальное внимание при форматировании лет: капитал «Y» ( Y
) обозначает «неделю в году», а нижний регистр «y» ( y
) обозначает год.
Преобразование строки в дату
parse()
из класса SimpleDateFormat
помогает преобразовать шаблон String
в объект 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
Существует 4 разных стиля для текстового формата: SHORT
, MEDIUM
(это значение по умолчанию), LONG
и FULL
, все из которых зависят от языка. Если локаль не указана, используется языковая система по умолчанию.
Стиль | Locale.US | Locale.France |
---|---|---|
КОРОТКАЯ | 6/30/09 | 30/06/09 |
СРЕДНЯЯ | 30 июня 2009 г. | 30 июня 2009 г. |
ДОЛГО | 30 июня 2009 г. | 30 июня 2009 г. |
ПОЛНЫЙ | Вторник, 30 июня 2009 г. | mardi 30 июня 2009 |
Основной вывод даты
Используя следующий код со строкой формата yyyy/MM/dd hh:mm.ss
, мы получим следующий вывод:
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()));
Преобразование форматированного строкового представления объекта date to Date
Этот метод можно использовать для преобразования форматированного строкового представления даты в объект 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;
}
Создание конкретной даты
Хотя класс Java Date имеет несколько конструкторов, вы заметите, что большинство из них устарело. Единственным приемлемым способом создания экземпляра Date напрямую является либо использование пустого конструктора, либо передача длинных (количество миллисекунд с момента стандартного базового времени). Ни один из них не является удобным, если вы не ищете текущую дату или не имеете другого экземпляра даты уже в руке.
Чтобы создать новую дату, вам понадобится экземпляр календаря. Оттуда вы можете установить экземпляр календаря на нужную вам дату.
Calendar c = Calendar.getInstance();
Это возвращает новый экземпляр календаря, установленный в текущее время. В календаре есть много способов для того, чтобы изменить дату и время или установить его прямо. В этом случае мы установим его на определенную дату.
c.set(1974, 6, 2, 8, 0, 0);
Date d = c.getTime();
Метод getTime
возвращает экземпляр Date, который нам нужен. Имейте в виду, что методы набора календаря устанавливают только одно или несколько полей, они не устанавливают их всех. То есть, если вы установите год, остальные поля остаются неизменными.
западня
Во многих случаях этот фрагмент кода выполняет свою задачу, но имейте в виду, что две важные части даты / времени не определены.
- параметры
(1974, 6, 2, 8, 0, 0)
интерпретируются в часовом поясе по умолчанию, определяемом где-то еще, - миллисекунды не устанавливаются на ноль, а заполняются из системных часов во время создания экземпляра календаря.
Объекты Java 8 LocalDate и LocalDateTime
Объекты Date и LocalDate не могут быть точно преобразованы между собой, поскольку объект Date представляет собой определенный день и время, в то время как объект LocalDate не содержит информацию о времени или часовом поясе. Тем не менее, может быть полезно преобразовать их между двумя, если вы заботитесь только о фактической информации о дате, а не о временной информации.
Создает LocalDate
// 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());
Создает 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());
LocalDate to Date и наоборот
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 и наоборот
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());
Часовой пояс и java.util.Date
Объект java.util.Date
не имеет понятия часового пояса.
- Невозможно установить часовой пояс для даты
- Невозможно изменить часовой пояс объекта Date
- Объект Date, созданный с помощью
new Date()
умолчанию, будет инициализирован текущим временем в системном часовом поясе
Тем не менее, можно отобразить дату, представленную точкой во времени, описанную объектом Date в другом часовом поясе, например, 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));
Выход:
Central European Time
2016-07-21 22:50:56
2016-07-21 21:50:56
Преобразовать java.util.Date в java.sql.Date
java.util.Date
для преобразования java.sql.Date
обычно необходимо, когда объект Date необходимо записать в базу данных.
java.sql.Date
- это оболочка с миллисекундным значением и используется JDBC
для идентификации типа SQL DATE
В приведенном ниже примере мы используем конструктор java.util.Date()
, который создает объект Date и инициализирует его для представления времени до ближайшей миллисекунды. Эта дата используется в методе convert(java.util.Date utilDate)
для возврата объекта java.sql.Date
пример
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;
}
}
Выход
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
имеет информацию о дате и времени, тогда как java.sql.Date
имеет только дату
Местное время
Чтобы использовать только временную часть Даты, используйте LocalTime. Вы можете создать экземпляр объекта LocalTime несколькими способами
-
LocalTime time = LocalTime.now();
-
time = LocalTime.MIDNIGHT;
-
time = LocalTime.NOON;
-
time = LocalTime.of(12, 12, 45);
LocalTime
также имеет встроенный метод toString, который отображает формат очень хорошо.
System.out.println(time);
вы также можете получать, добавлять и вычитать часы, минуты, секунды и наносекунды из объекта LocalTime, т. е.
time.plusMinutes(1);
time.getMinutes();
time.minusMinutes(1);
Вы можете превратить его в объект Date со следующим кодом:
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);
этот класс отлично работает в классе таймера для имитации будильника.