Как получить год, месяц, день, часы, минуты, секунды и миллисекунды текущего момента на Java?


104

Как я могу получить год, месяц, день, часы, минуты, секунды и миллисекунды текущего момента на Java? Хотелось бы, чтобы они были как Strings.

Ответы:


255

Для этого вы можете использовать геттеры java.time.LocalDateTime.

LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

Или, когда вы еще не используете Java 8, используйте java.util.Calendar.

Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

В любом случае, на данный момент это печатает:

2010-04-16 15: 15: 17.816

Чтобы преобразовать intв String, используйте String#valueOf().


Если вы все- таки намерены упорядочить и отобразить их в удобном для человека строковом формате, тогда лучше используйте либо Java8 java.time.format.DateTimeFormatter( учебник здесь ), либо

LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

или когда вы еще не используете Java 8, используйте java.text.SimpleDateFormat:

Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

В любом случае это дает:

2010-04-16T15: 15: 17.816
Пт, 16 апр 2010 г. 15:15:17 GMT
20100416151517

Смотрите также:


Если вы собираетесь использовать printf, то вы можете просто использовать форматы для даты / времени вместо промежуточного шага, например «% 1 $ tm% 1 $ te,% 1 $ tY», c (см. Java.util. Formatter для полного синтаксиса)
М. Джессап

1
@M. Джессап: Это действительно лучше. Однако я никогда не использовал его, поэтому я не мог ввести его с головы, это просто для демонстрационных целей. В любом случае, я бы предпочел схватить SimpleDateFormatили DateTimeFormatterдля этой конкретной задачи :)
BalusC

Я настоятельно рекомендую использовать joda-time, поскольку его API гораздо приятнее и понятнее по сравнению с плохо разработанными датами и календарями, которые предлагает Java напрямую.
Kaitsu

Я предпочитаю этот, особенно в работе с i18n, чтобы получить startTime или endTime:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Эдди,

1
Большая часть функциональности java.time перенесена на Java 6 и 7 в проекте ThreeTen-Backport .
Basil

30

Переключитесь на joda-time, и вы можете сделать это в трех строках

DateTime jodaTime = new DateTime();

DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
System.out.println("jodaTime = " + formatter.print(jodaTime));

У вас также есть прямой доступ к отдельным полям даты без использования календаря.

System.out.println("year = " + jodaTime.getYear());
System.out.println("month = " + jodaTime.getMonthOfYear());
System.out.println("day = " + jodaTime.getDayOfMonth());
System.out.println("hour = " + jodaTime.getHourOfDay());
System.out.println("minute = " + jodaTime.getMinuteOfHour());
System.out.println("second = " + jodaTime.getSecondOfMinute());
System.out.println("millis = " + jodaTime.getMillisOfSecond());

Результат выглядит следующим образом:

jodaTime = 2010-04-16 18:09:26.060

year = 2010
month = 4
day = 16
hour = 18
minute = 9
second = 26
millis = 60

Согласно http://www.joda.org/joda-time/

Joda-Time - это де-факто стандартная библиотека даты и времени для Java. Начиная с Java SE 8 и далее пользователям предлагается перейти на java.time (JSR-310).


1
К вашему сведению, проект Joda-Time сейчас находится на обслуживании, и его команда советует перейти на классы java.time. И Joda-Time, и java.time возглавляет один и тот же человек, Стивен Коулборн.
Basil

7
    // Java 8
    System.out.println(LocalDateTime.now().getYear());       // 2015
    System.out.println(LocalDateTime.now().getMonth());      // SEPTEMBER
    System.out.println(LocalDateTime.now().getDayOfMonth()); // 29
    System.out.println(LocalDateTime.now().getHour());       // 7
    System.out.println(LocalDateTime.now().getMinute());     // 36
    System.out.println(LocalDateTime.now().getSecond());     // 51
    System.out.println(LocalDateTime.now().get(ChronoField.MILLI_OF_SECOND)); // 100

    // Calendar
    System.out.println(Calendar.getInstance().get(Calendar.YEAR));         // 2015
    System.out.println(Calendar.getInstance().get(Calendar.MONTH ) + 1);   // 9
    System.out.println(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); // 29
    System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY));  // 7
    System.out.println(Calendar.getInstance().get(Calendar.MINUTE));       // 35
    System.out.println(Calendar.getInstance().get(Calendar.SECOND));       // 32
    System.out.println(Calendar.getInstance().get(Calendar.MILLISECOND));  // 481

    // Joda Time
    System.out.println(new DateTime().getYear());           // 2015
    System.out.println(new DateTime().getMonthOfYear());    // 9
    System.out.println(new DateTime().getDayOfMonth());     // 29
    System.out.println(new DateTime().getHourOfDay());      // 7
    System.out.println(new DateTime().getMinuteOfHour());   // 19
    System.out.println(new DateTime().getSecondOfMinute()); // 16
    System.out.println(new DateTime().getMillisOfSecond()); // 174

    // Formatted
    // 2015-09-28 17:50:25.756
    System.out.println(new Timestamp(System.currentTimeMillis()));

    // 2015-09-28T17:50:25.772
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(new Date()));

    // Java 8
    // 2015-09-28T17:50:25.810
    System.out.println(LocalDateTime.now());

    // joda time
    // 2015-09-28 17:50:25.839
    System.out.println(DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS").print(new org.joda.time.DateTime()));

Этот ответ действительно касается вопроса, который спрашивал о доступе к компонентам значения даты и времени (а не к обычным отформатированным строкам).
Basil Bourque

6

В Java 8 и новее используйте пакет java.time .

ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();

ZonedDateTime.now()- статический метод, возвращающий текущую дату и время из системных часов в часовом поясе по умолчанию. Все методы get возвращают intзначение.


LocalDateTimeточно не тот класс для этого. Не имея какой-либо концепции часового пояса или смещения от UTC, его нельзя использовать для отслеживания определенного момента, это не точка на временной шкале. Используйте Instant, ZonedDateTimeили OffsetDateTimeвместо.
Basil Bourque

Ты прав. Я изменил свой ответ, чтобы использовать расширение ZonedDateTime.
Ortomala Lokni

3

tl; dr

ZonedDateTime.now(                    // Capture current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
    ZoneId.of( "America/Montreal" )   // Specify desired/expected time zone. Or pass `ZoneId.systemDefault` for the JVM’s current default time zone.
)                                     // Returns a `ZonedDateTime` object.
.getMinute()                          // Extract the minute of the hour of the time-of-day from the `ZonedDateTime` object.

42

ZonedDateTime

Чтобы запечатлеть текущий момент во времени настенных часов, используемом людьми из определенного региона (часовой пояс), используйте ZonedDateTime.

Часовой пояс имеет решающее значение при определении даты. В любой момент дата меняется в зависимости от зоны земного шара. Например, несколько минут после полуночи в Париже, Франция - это новый день, в то время как в Монреаль-Квебеке все еще «вчера» .

Если часовой пояс не указан, JVM неявно применяет текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.

Укажите правильное время имя зоны в формате continent/region, например America/Montreal, Africa/Casablancaили Pacific/Auckland. Никогда не используйте аббревиатуру из 3–4 букв, например ESTили, ISTпоскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).

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

Вызовите любого из множества геттеров, чтобы вытащить части даты и времени.

int    year        = zdt.getYear() ;
int    monthNumber = zdt.getMonthValue() ;
String monthName   = zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.JAPAN ) ;  // Locale determines human language and cultural norms used in localizing. Note that `Locale` has *nothing* to do with time zone.
int    dayOfMonth  = zdt.getDayOfMonth() ;
String dayOfWeek   = zdt.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 
int    hour        = zdt.getHour() ;  // Extract the hour from the time-of-day.
int    minute      = zdt.getMinute() ;
int    second      = zdt.getSecond() ;
int    nano        = zdt.getNano() ;

В java.time классы полны решимости наносекунд . В вашем вопросе запрашивается доля секунды в миллисекундах . Очевидно, вы можете разделить на миллион, чтобы сократить наносекунды до миллисекунд за счет возможной потери данных. Или используйте TimeUnitперечисление для такого преобразования.

long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;

DateTimeFormatter

Чтобы создать a Stringдля объединения фрагментов текста, используйте DateTimeFormatterclass. Найдите в Stack Overflow дополнительную информацию.

Instant

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

Instant instant = zdt.toInstant() ;

И вернись снова.

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;

LocalDateTime

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

Итак, для чего это LocalDateTimeнужно? Используйте, LocalDateTimeесли вы собираетесь применить дату и время к любому месту или ко всем местам , а не к одному конкретному месту.

Например, Рождество в этом году начинается в LocalDateTime.parse( "2018-12-25T00:00:00" ). Это значение не имеет значения, пока вы не примените часовой пояс (а ZoneId) для получения ZonedDateTime. Рождество происходит сначала на Кирибати , затем в Новой Зеландии и на Дальнем Востоке Азии. Через несколько часов в Индии начинается Рождество. Еще час спустя в Африке и Европе. И все же Рождество в Америке появится несколько часов спустя. Рождество , начиная с любого одного места должны быть представлены ZonedDateTime. Рождество везде представлено с изображением LocalDateTime.


О java.time

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

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .

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

Где взять классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • В Java 9 добавлены некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
  • Android

2

Или используйте java.sql.Timestamp. Календарь довольно тяжелый, я бы не рекомендовал использовать его в производственном коде. Джода лучше.

import java.sql.Timestamp;

public class DateTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(new Timestamp(System.currentTimeMillis()));
    }
}

Я думаю, вы неправильно поняли как вопрос, так и использование временной метки sql. Обычно вы используете new Date()здесь. Но как бы вы могли легко получить из него отдельные части по запросу?
BalusC

FYI, java.sql.Timestampбыл вытеснен java.time.Instantс приходом JDBC 4.2.
Basil Bourque

0

в java 7 Calendar одна строка

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())

1
Проблемные классы Calendar и SimpleDateFormat теперь устарели и полностью вытеснены классами java.time. См. Ответ BalusC о современном подходе. Большая часть функциональности java.time перенесена на Java 6 и 7 в проекте ThreeTen-Backport .
Basil

-2

Посмотрите документацию по API для класса java.util.Calendar и его производных (вас может особенно заинтересовать класс GregorianCalendar).


К вашему сведению, неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormat, теперь унаследованы , вытеснены классами java.time, встроенными в Java 8 и новее. См. Учебник Oracle .
Basil Bourque

-2

Calendar now = new Calendar () // или new GregorianCalendar (), или любой другой вкус, который вам нужен

сейчас.МЕСЯЦ сейчас.ЧАС

и т.п.


3
Привет, мне трудно понять, почему вы плохо повторяете уже данный ответ. Пожалуйста, уточните :)
BalusC

3
MONTHи HOURявляются статическими константами Calendar, а не свойствами экземпляра.
Джозеф Эрл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.