Как получить текущую дату/время в Java

каков наилучший способ получить текущую дату / время в Java?

24 ответов


это зависит от того, какую форму даты / времени вы хотите:

  • если вы хотите дату / время как одно числовое значение, то System.currentTimeMillis() дает вам это, выраженное как количество миллисекунд после эпохи UNIX (как Java long). Это значение является дельтой от точки времени UTC и не зависит от локального часового пояса ... при условии, что системные часы установлены правильно.

  • если вы хотите дату / время в форме, позволяет получить доступ к компонентам (год, месяц и т. д.) численно, можно использовать один из следующих:

    • new Date() дает Date объект инициализирован текущей датой / временем. Проблема в том, что Date методы API в основном ущербные ... и осужден.

    • Calendar.getInstance() дает Calendar объект инициализируется текущей датой / временем, используя значение по умолчанию Locale и TimeZone. Другие перегрузки позволяют использовать специфический Locale и/или TimeZone. Календарь работает ... но APIs все еще громоздки.

    • new org.joda.time.DateTime() дает Joda времени объект инициализируется текущей датой / временем, используя часовой пояс и хронологию по умолчанию. Есть много других альтернатив Joda ... слишком много, чтобы описать здесь. (Но обратите внимание, что некоторые люди сообщают, что у Joda time есть проблемы с производительностью.; например,LocalDateTime Jodatime медленно при использовании первого время.)

    • в Java 8 вызов LocalDateTime.now() и ZonedDateTime.now() даст вам представления1 для текущей даты / времени.

до Java 8, большинство людей, которые знают об этих вещах рекомендовано Joda времени как имеющий (на сегодняшний день) лучшие API Java для выполнения вещей, связанных с вычислениями точки времени и продолжительности. С Java 8 это больше не верно. Однако, если вы уже используя время Joda в вашей кодовой базе, нет сильного2 причина для переноса.


1 - Обратите внимание, что LocalDateTime не включает часовой пояс. Как говорит javadoc: " он не может представлять момент времени без дополнительной информации, такой как смещение или часовой пояс."

2 - код не сломается, если вы не, и вы не получите предупреждения. Конечно, кодовая база Joda, вероятно, будет перестаньте получать обновления, но вряд ли они вам понадобятся. Отсутствие обновлений означает стабильность, и это хороший вещь.


Если вам просто нужно вывести отметку времени в формате гггг.Мм ДД-ХХ.Мм SS (очень частый случай) тогда вот как это сделать:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());

Если вы хотите текущую дату в виде строки, попробуйте следующее:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date));

или

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));

http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/


на Java 8 это:

LocalDateTime.now()

и в случае, если вам нужна информация о часовом поясе:

ZonedDateTime.now()

и в случае, если вы хотите напечатать необычные отформатированную строку:

System.out.println(ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME))

просто создайте объект Date...

Date date = new Date();

    // 2015/09/27 15:07:53
    System.out.println( new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime()) );

    // 15:07:53
    System.out.println( new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()) );

    // 09/28/2015
    System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));

    // 20150928_161823
    System.out.println( new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()) );

    // Mon Sep 28 16:24:28 CEST 2015
    System.out.println( Calendar.getInstance().getTime() );

    // Mon Sep 28 16:24:51 CEST 2015
    System.out.println( new Date(System.currentTimeMillis()) );

    // Mon Sep 28
    System.out.println( new Date().toString().substring(0, 10) );

    // 2015-09-28
    System.out.println( new java.sql.Date(System.currentTimeMillis()) );

    // 14:32:26
    Date d = new Date();
    System.out.println( (d.getTime() / 1000 / 60 / 60) % 24 + ":" + (d.getTime() / 1000 / 60) % 60 + ":" + (d.getTime() / 1000) % 60 );

    // 2015-09-28 17:12:35.584
    System.out.println( new Timestamp(System.currentTimeMillis()) );

    // Java 8

    // 2015-09-28T16:16:23.308+02:00[Europe/Belgrade]
    System.out.println( ZonedDateTime.now() );

    // Mon, 28 Sep 2015 16:16:23 +0200
    System.out.println( ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME) );

    // 2015-09-28
    System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class

    // 16
    System.out.println( LocalTime.now().getHour() );

    // 2015-09-28T16:16:23.315
    System.out.println( LocalDateTime.now() );

tl; dr

Instant.now()                                         // Capture the current moment in UTC, with a resolution of nanoseconds.

... и ...

ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )  // Capture the current moment as seen in the wall-clock time used by the people of a particular region (a time zone).

java.время

в нескольких ответах упоминается, что java.время классы являются современной заменой для проблемных старых устаревших классов даты и времени в комплекте с самыми ранними версиями Java. Ниже немного больше информации.

часовой пояс

в других ответах не объясняется, как часовой пояс имеет решающее значение для определения текущей даты и времени. Для любого данного момент, дата и время варьируется по всему миру по зонам. Например, несколько минут после полуночи новый день в Париж, Франция будучи еще "вчера" в Квебека Монреале.

Instant

большая часть вашей бизнес-логики и хранения данных / обмена должна быть выполнена в UTC, как лучшая практика. Чтобы получить текущий момент в UTC с разрешением в наносекунд используйте Instant класса.

Instant instant = Instant.now();

ZonedDateTime

вы можете настроить это Instant в другие часовые пояса. Применить ZoneId объект, чтобы получить ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

мы можем пропустить Instant и получаем ток!--13--> напрямую.

ZonedDateTime zdt = ZonedDateTime.now( z );

всегда передавайте этот необязательный аргумент часового пояса. Если опущено, применяется текущий часовой пояс JVM по умолчанию. Этот значение по умолчанию может изменяться в любой момент, даже во время во время выполнения. Не подвергайте приложение воздействию внешних факторов, не зависящих от вас. Всегда указывайте желаемый / ожидаемый часовой пояс.

ZonedDateTime do_Not_Do_This = ZonedDateTime.now(); // BAD - Never rely implicitly on the current default time zone.

вы можете позже извлечь Instant С ZonedDateTime.

Instant instant = zdt.toInstant();

всегда используйте Instant или ZonedDateTime, а не LocalDateTime если вы хотите реальный момент на временной шкале. The Local… типы намеренно не имеют понятия о времени поэтому они представляют собой лишь приблизительное представление о возможном моменте. Чтобы получить фактический момент, Вы должны назначить часовой пояс для преобразования Local… типы в ZonedDateTime и тем самым сделать его осмысленным.

LocalDate

на LocalDate класс представляет значение только даты без времени суток и без часового пояса.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );  // Always pass a time zone.

строки

чтобы создать строку, представляющую значение даты и времени, просто вызовите toString на Ява.время занятий по стандарту ISO 8601 форматы.

String output = myLocalDate.toString();  // 2016-09-23

... и ...

String output = zdt.toString();  // 2016-09-23T12:34:56.789+03:00[America/Montreal]

на ZonedDateTime класс расширяет стандартный формат, мудро добавив имя часового пояса в квадратных скобках.

для других форматов, переполнение стека поиска для многих вопросов и ответов на DateTimeFormatter класса.

избежать LocalDateTime

вопреки комментарию на вопрос Рамансба, вы должен!--67-->не использовать LocalDateTime класс для текущей даты и времени.

на LocalDateTime намеренно отсутствует какой-либо часовой пояс или смещение от UTC информации. Итак, это не уместно, когда вы отслеживаете определенный момент на временной шкале. Конечно не подходит для захвата текущего момента.

" локальная " формулировка противоречит интуиции. Это значит любой населенный пункт, а не любой специфическая местность. Например, Рождество в этом году начинается в полночь 25 декабря:2017-12-25T00:00:00, быть представленным как LocalDateTime. Но это означает полночь в разных точках земного шара в разное время. Полночь случается первой в Кирибати, позже в Новой Зеландии, еще через несколько часов в Индии и так далее, и еще несколько часов до Рождества начинается во Франции, когда дети в Канаде все еще ждут этого дня. Каждый из этих рождественских стартовых пунктов будет представлен как отдельный ZonedDateTime.


извне вашей системы

если вы не можете доверять ваши часы, увидеть Java: получить текущую дату и время с сервера не системные часы и мой ответ:.

photo of a couple of external radio clock devices

java.time.Clock

чтобы использовать альтернативного поставщика текущего момента, напишите подкласс абстрактного java.time.Clock класса.

вы можете передать свой Clock реализация в качестве аргумента для различных java.время методы. Например, Instant.now( clock ).

Instant instant = Instant.now( yourClockGoesHere ) ;

для целей тестирования, обратите внимание на альтернативных реализаций Clock доступные статически от : fixed, offset, tick и многое другое.


о java.время

на java.время framework встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

на Joda Времени, теперь режим обслуживания, советует переход к java.время классы.

чтобы узнать больше, см. Oracle Tutorial. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.

вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте драйвер JDBC соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в java.sql.* занятия.

где получить java.время занятий?

  • Java SE 8, Java SE 9, и позже
    • встроенный.
    • часть стандартного API Java со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • более поздние версии Android bundle реализации java.классы время.
    • для более раннего Android, ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). См.как использовать ThreeTenABP....

на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и больше.


использование:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
System.out.println(timeStamp );

(оно работает.)


существует множество различных методов:


создайте объект даты и просто распечатайте его.

Date d = new Date(System.currentTimeMillis());
System.out.print(d);

вы смотрели на java.утиль.Дата? Это именно то, чего ты хочешь.


подобно вышеуказанным решениям. Но я всегда нахожу, что ищу этот кусок кода:

Date date=Calendar.getInstance().getTime();
System.out.println(date);

java.util.Date date = new java.util.Date();

он автоматически заполняется временем его создания.


Я считаю, что это лучший способ:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime())); // 2014/08/06 16:00:22

1-й поймите java.утиль.Класс даты

1.1 Как получить текущую дату

import java.util.Date;

class Demostration{
    public static void main(String[]args){
        Date date = new Date(); // date object
        System.out.println(date); // Try to print the date object
    }
}

1.2 Как использовать метод getTime ()

import java.util.Date;
public class Main {
    public static void main(String[]args){
        Date date = new Date();
        long timeInMilliSeconds = date.getTime();
        System.out.println(timeInMilliSeconds);
    }
}

это вернет количество миллисекунд с 1 января 1970 года, 00:00: 00 GMT для целей сравнения времени.

1.3 как форматировать время с помощью класса SimpleDateFormat

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

class Demostration{
    public static void main(String[]args){
        Date date=new Date();
        DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate=dateFormat.format(date);
        System.out.println(formattedDate);
    }
}

также попробуйте использовать различные шаблоны формата как "гггг-ММ-ДД чч:мм:СС" и выберите нужный узор. http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

2-й поймите java.утиль.Класс календаря

2.1 использование класса календаря для получения текущей отметки времени

import java.util.Calendar;

class Demostration{
    public static void main(String[]args){
        Calendar calendar=Calendar.getInstance();
        System.out.println(calendar.getTime());
    }
}

2.2 попробуйте использовать setTime и другие методы set для установки календаря на другую дату.

источник:http://javau91.blogspot.com/


использование:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd::HH:mm:ss");
System.out.println(sdf.format(System.currentTimeMillis()));

оператор print будет печатать время, когда он вызывается, а не когда . Поэтому его можно вызывать повторно, не создавая никаких новых объектов.


для java.утиль.Дата, просто создайте новую дату ()

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date)); //2016/11/16 12:08:43

для java.утиль.Календарь, использует календарь.getInstance ()

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal)); //2016/11/16 12:08:43

для java.время.LocalDateTime, использует LocalDateTime.сейчас()

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
System.out.println(dtf.format(now)); //2016/11/16 12:08:43

для java.время.LocalDate, использует LocalDate.сейчас()

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate localDate = LocalDate.now();
System.out.println(dtf.format(localDate)); //2016/11/16

ссылка: https://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/


посмотреть дата класса. Есть также более новые календарь класс, который является предпочтительным методом выполнения многих операций даты / времени (многие методы на дату устарели.)

Если вы просто хотите текущую дату, то либо создайте новый объект даты, либо вызовите Calendar.getInstance();.


Как уже упоминалось, основная дата() может делать то, что вам нужно с точки зрения получения текущего времени. В моем недавнем опыте работы с датами Java есть много странностей со встроенными классами (а также устаревание многих методов класса Date). Одна странность, которая выделилась для меня было, что месяцев индекс 0, который с технической точки зрения имеет смысл, но в реальном выражении может быть очень запутанной.

Если вас интересует только текущая дата, которая должно быть достаточно-однако, если вы собираетесь делать много манипуляций / вычислений с датами, было бы очень полезно использовать стороннюю библиотеку (так много существует, потому что многие разработчики Java не удовлетворены встроенной функциональностью).

Я поддерживаю рекомендацию Стивена C, поскольку я нашел Joda-time очень полезным в упрощении моей работы с датами, она также очень хорошо документирована, и вы можете найти много полезных примеров по всему интернету. Я даже закончил писать статический класс-оболочка (как DateUtils), который я использую для консолидации и упрощения всех моих общих манипуляций с датой.


import java.util.*;
import java.text.*;

public class DateDemo {
   public static void main(String args[]) {
      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
      System.out.println("Current Date: " + ft.format(dNow));
   }
}

вы можете использовать дату для текущих данных fet. Итак, используя SimpleDateFormat вам формате


 System.out.println( new SimpleDateFormat("yyyy:MM:dd - hh:mm:ss a").format(Calendar.getInstance().getTime()) );
    //2018:02:10 - 05:04:20 PM

дата/время с AM / PM


новый API времени данных вводится с рассветом Java 8. Это связано к следующим проблемам, которые были вызваны в старом API времени данных.

трудно обрабатывать часовой пояс : нужно написать много кода, чтобы иметь дело с часовой пояс.

не потокобезопасно: java.утиль.Дата не является потокобезопасной.

Так что посмотрите вокруг С Java 8

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.Month;


public class DataTimeChecker {

    public static void main(String args[]) {
        DataTimeChecker dateTimeChecker = new DataTimeChecker();
        dateTimeChecker.DateTime();
    }

    public void DateTime() {
        // Get the current date and time
        LocalDateTime currentTime = LocalDateTime.now();
        System.out.println("Current DateTime: " + currentTime);

        LocalDate date1 = currentTime.toLocalDate();
        System.out.println("Date : " + date1);

        Month month = currentTime.getMonth();
        int day = currentTime.getDayOfMonth();
        int seconds = currentTime.getSecond();

        System.out.println("Month : " + month);
        System.out.println("Day : " + day);
        System.out.println("Seconds : " + seconds);

        LocalDateTime date2 = currentTime.withDayOfMonth(17).withYear(2018);
        System.out.println("Date : " + date2);

        //Prints 17 May 2018
        LocalDate date3 = LocalDate.of(2018, Month.MAY, 17);
        System.out.println("Date : " + date3);

        //Prints 04 hour 45 minutes
        LocalTime date4 = LocalTime.of(4, 45);
        System.out.println("Date : " + date4);

        // Convert to a String 
        LocalTime date5 = LocalTime.parse("20:15:30");
        System.out.println("Date : " + date5);
    }
}

вывод кодировки выше:

Current DateTime: 2018-05-17T04:40:34.603
Date : 2018-05-17
Month : MAY
Day : 17
Seconds : 34
Date : 2018-05-17T04:40:34.603
Date : 2018-05-17
Date : 04:45
Date : 20:15:30

можно использовать Date объект и формат самостоятельно. Трудно форматировать и нужно больше кодов, например,

Date dateInstance = new Date();
int year = dateInstance.getYear()+1900;//Returns:the year represented by this date, minus 1900.
int date = dateInstance.getDate();
int month = dateInstance.getMonth();
int day = dateInstance.getDay();
int hours = dateInstance.getHours();
int min = dateInstance.getMinutes();
int sec = dateInstance.getSeconds();

String dayOfWeek = "";
switch(day){
    case 0:
        dayOfWeek = "Sunday";
        break;
    case 1:
        dayOfWeek = "Monday";
        break;
    case 2:
        dayOfWeek = "Tuesday";
        break;
    case 3:
        dayOfWeek = "Wednesday";
        break;
    case 4:
        dayOfWeek = "Thursday";
        break;
    case 5:
        dayOfWeek = "Friday";
        break;
    case 6:
        dayOfWeek = "Saturday";
        break;
}
System.out.println("Date: " + year +"-"+ month + "-" + date + " "+ dayOfWeek);
System.out.println("Time: " + hours +":"+ min + ":" + sec);

выход:

Date: 2017-6-23 Sunday
Time: 14:6:20

как вы можете видеть, это худший способ, которым вы можете это сделать, и согласно документации oracle это устаревший.

Oracle doc:

дата класса представляет определенный момент времени, с миллисекундой точность.

до JDK 1.1, дата класса имела две дополнительные функции. Он допускается толкование дат как год, месяц, день, час, минута, и вторые ценности. Это также позволило форматирование и синтаксический анализ даты веревка. К сожалению, API для этих функций не поддается к интернационализации. Начиная с JDK 1.1, класс Calendar должен быть используется для преобразования между полями даты и времени и классом DateFormat следует использовать для форматирования и анализа строк даты. Соответствие методы на сегодняшний день являются не одобрять.

таким образом, вы можете использовать Calendar класса,

Calendar.YEAR;
//and lot more

чтобы получить текущее время, вы можете использовать:

Calendar rightNow = Calendar.getInstance();

Doc:

как и другие классы, чувствительные к локали,Calendar предоставляет метод класса, getInstance, для получения обычно полезного объекта этого типа. Календарь getInstance метод возвращает

ниже код, чтобы получить только дату

Date rightNow = Calendar.getInstance().getTime();
System.out.println(rightNow);

и Calendar класс имеет подклассы. GregorianCalendar является одним из них и конкретным подклассом Calendar и обеспечивает стандартную систему календаря, используемую большинством стран мира.

пример использования GregorianCalendar:

Calendar cal = new GregorianCalendar();
int hours = cal.get(Calendar.HOUR);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
int ap = cal.get(Calendar.AM_PM);

String amVSpm;
if(ap == 0){
    amVSpm = "AM";
}else{
    amVSpm = "PM";
}

String timer = hours + "-" + minute + "-" + second + " " +amVSpm;
System.out.println(timer);

можно использовать SimpleDateFormat, простой и быстрый способ форматирования даты:

String pattern = "yyyy-MM-dd";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

String date = simpleDateFormat.format(new Date());
System.out.println(date);

читать это Якоб Jenkov учебник: Java SimpleDateFormat.

как уже упоминалось, когда нам нужно делать манипуляции с датами, у нас не было простого и лучшего способа или мы не могли удовлетворить встроенные классы, API.

в качестве примера, когда нам нужно получить разные между двумя датами, когда нам нужно сравнить две даты(есть встроенный метод для этого) и многое другое. Нам пришлось использовать сторонние библиотеки. Одним из хороших и популярных является Время Джода.

Читайте также:

. Самое счастливое сейчас (в java 8), никому не нужно скачивать и использовать библиотеки по каким-либо причинам. Простой пример получить текущую дату и время в Java 8,

LocalTime localTime = LocalTime.now();
System.out.println(localTime);

//with time zone
LocalTime localTimeWtZone = LocalTime.now(ZoneId.of("GMT+02:30"));
System.out.println(localTimeWtZone);

одним из хорошее сообщение в блоге, чтобы прочитать о Java 8 date.

и держите remeber, чтобы узнать больше о дате и времени Java, потому что есть намного больше способов и/или полезных способов, которые вы можете получить/использовать.

EDIT:

согласно комментарию @BasilBourque, хлопотные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleTextFormat теперь наследие, взамен java.time классы.


Я пойду вперед и брошу этот ответ, потому что это все, что мне нужно, когда у меня был тот же вопрос:

Date currentDate = new Date(System.currentTimeMillis());

currentDate теперь ваша текущая дата в Java