Как получить год, месяц, день, часы, минуты, секунды и миллисекунды текущего момента в Java? - PullRequest
95 голосов
/ 16 апреля 2010

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

Ответы [ 9 ]

235 голосов
/ 16 апреля 2010

Для этого вы можете использовать геттеры 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
Fri, 16 Apr 2010 15:15:17 GMT
20100416151517

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

29 голосов
/ 16 апреля 2010

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

6 голосов
/ 28 сентября 2015
    // 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()));
6 голосов
/ 15 июня 2015

В 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.

2 голосов
/ 21 июня 2018

ТЛ; др

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

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

Instant

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

Instant instant = zdt.toInstant() ;

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

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

LocalDateTime

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

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

image

Например, Рождество в этом году начинается с 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 . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

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

Где получить классы java.time?

2 голосов
/ 16 апреля 2010

Или используйте 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()));
    }
}
0 голосов
/ 22 мая 2017

в Java 7 Календарь одной строкой

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
0 голосов
/ 16 апреля 2010

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

now.MONTH now.HOUR

и т.д.

0 голосов
/ 16 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...