Поиск…


Синтаксис

  • 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

Календарь, дата и локальная дата

Java SE 8

до, после, 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)));
Java SE 8

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 методов для сравнения дат:

В случае параметра 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 несколькими способами

  1. LocalTime time = LocalTime.now();
  2. time = LocalTime.MIDNIGHT;
  3. time = LocalTime.NOON;
  4. 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);

этот класс отлично работает в классе таймера для имитации будильника.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow