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

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


person Roman    schedule 16.04.2010    source источник


Ответы (9)


Для этого вы можете использовать геттеры 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().


Если вы намерены в конце концов упорядочить и отобразить их в удобном для человека строковом формате, тогда лучше использовать либо _ 8_ (руководство здесь),

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
Fri, 16 Apr 2010 15:15:17 GMT
20100416151517

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

person BalusC    schedule 16.04.2010
comment
Если вы собираетесь использовать printf, то вы можете просто использовать форматы Date / Times вместо использования промежуточного шага, т.е.% 1 $ tm% 1 $ te,% 1 $ tY, c (см. Java.util.Formatter для полный синтаксис) - person M. Jessup; 16.04.2010
comment
@M. Джессап: Это действительно лучше. Однако я никогда не использовал его, поэтому я не мог войти в него с головы, это просто для демонстрационных целей. Тем не менее, я бы предпочел взять SimpleDateFormat или DateTimeFormatter для этой конкретной задачи :) - person BalusC; 16.04.2010
comment
Я настоятельно рекомендую использовать joda-time, так как это гораздо более приятный и понятный API по сравнению с плохо спроектированными датами и календарями, которые предлагает Java напрямую. - person Kaitsu; 23.04.2012
comment
Я предпочитаю этот, особенно в i18n, чтобы получить startTime или endTime: new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date()); - person Eddy; 30.05.2016
comment
Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen -Бэкпорт проекта. - person Basil Bourque; 22.05.2017
comment
В качестве детали я рекомендую вам передать ZoneId LocalDateTime.now(). Таким образом вы явно указываете, что операция зависит от часового пояса, и сообщаете читателю, что вы сделали сознательный выбор часового пояса. Например ZoneId.of("America/Argentina/Salta") или ZoneId.systemDefault(). - person Ole V.V.; 01.10.2017
comment
LocalDateTime не подходит для этого. В отсутствие какой-либо концепции часового пояса или смещения от UTC, он не может использоваться для отслеживания определенного момента, это не точка на временной шкале. Вместо этого используйте Instant, ZonedDateTime или OffsetDateTime. - person Basil Bourque; 21.06.2018
comment
@BasilBourque В вопросе не упоминается текущее время в определенном часовом поясе. Так что LocalDateTime в полном порядке. Очевидно, вам понадобится ZonedDateTime, если вам нужно текущее время в определенном часовом поясе, но об этом не спрашивали. - person BalusC; 21.06.2018
comment
Я искал часы миллисекунды второго геттера, этот ответ сразу дал понять, что его нет. - person Valentino Miori; 25.05.2021

Переключитесь на 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).

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

В Java 8 и более поздних версиях используйте java. пакет времени.

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

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

person Ortomala Lokni    schedule 15.06.2015
comment
LocalDateTime - совершенно неподходящий класс для этого. В отсутствие какой-либо концепции часового пояса или смещения от UTC, он не может использоваться для отслеживания определенного момента, это не точка на временной шкале. Вместо этого используйте Instant, ZonedDateTime или OffsetDateTime. - person Basil Bourque; 21.06.2018
comment
Ты прав. Я изменил свой ответ, чтобы использовать ZonedDateTime. - person Ortomala Lokni; 21.06.2018

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

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

Часовой пояс имеет решающее значение при определении даты. В любой момент дата меняется в зависимости от зоны земного шара. Например, через несколько минут после полуночи в Париже, Франция будет новый день, а «вчера ”В Montréal Québec.

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

Укажите правильное название часового пояса в формате continent/region, например _ 5_, _ 6_ или 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

Чтобы создать String для объединения фрагментов текста, используйте DateTimeFormatter класс. Для получения дополнительной информации поищите Stack Overflow.

Instant

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

Instant instant = zdt.toInstant() ;

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

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

LocalDateTime

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

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

. Это значение не имеет значения, пока вы не примените часовой пояс (ZoneId), чтобы получить ZonedDateTime. Рождество случается сначала в Кирибати, затем в Новой Зеландии и на Дальнем Востоке Азии. Через несколько часов в Индии начинается Рождество. Еще час спустя в Африке и Европе. И все же Рождество в Америке появится несколько часов спустя. Рождество, начинающееся в любом одном месте, должно быть обозначено ZonedDateTime. Рождество везде обозначается LocalDateTime.


О java.time

java.time framework встроена в Java 8 и новее. Эти классы заменяют неудобные старые устаревшие классы даты и времени, такие как _ 30_, _ 31_, & _ 32_.

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

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

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

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

person Basil Bourque    schedule 20.06.2018

Или используйте 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()));
    }
}
person pavel    schedule 16.04.2010
comment
Я думаю, вы неправильно поняли как вопрос, так и использование временной метки sql. Обычно здесь используется new Date(). Но как бы вы могли легко получить из него отдельные части по запросу? - person BalusC; 16.04.2010
comment
К вашему сведению, java.sql.Timestamp был вытеснен java.time.Instant с появлением JDBC 4.2. - person Basil Bourque; 21.06.2018

в календаре java 7 одна строка

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
person Lucke    schedule 22.05.2017
comment
Проблемные классы Calendar и SimpleDateFormat теперь устарели и полностью вытеснены классами java.time. См. ответ BalusC о современном подходе. Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen -Бэкпорт проекта. - person Basil Bourque; 22.05.2017

Используйте шаблон форматирования "дд-ММ-гггг ЧЧ: мм: сс аа", чтобы получить дату как 21-10-2020 20:53:42 pm.

person techloris_109    schedule 21.10.2020

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

person M. Jessup    schedule 16.04.2010
comment
К вашему сведению, неприятные старые классы даты и времени, такие как java.util.Date , java.util.Calendar и java.text.SimpleDateFormat теперь являются устаревшими, замененными java.time классы, встроенные в Java 8 и новее. См. Руководство от Oracle. - person Basil Bourque; 21.06.2018

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

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

и Т. Д.

person llappall    schedule 16.04.2010
comment
Привет, мне трудно понять, почему вы плохо повторяете уже данный ответ. Пожалуйста, дополните :) - person BalusC; 16.04.2010
comment
MONTH и HOUR - статические константы Calendar, а не свойства экземпляра. - person Joseph Earl; 09.08.2013