Як отримати рік, місяць, день, години, хвилини, секунди та мілісекунди поточного моменту на Яві?


104

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

Відповіді:


254

Ви можете використовувати для цього геттери 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, ви можете також просто використовувати формати для Date / Times замість кроку посередника, тобто "% 1 $ tm% 1 $ te,% 1 $ tY", c (див. Java.util. Форматтер для повного синтаксису)
М. Джессуп

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

Я настійно пропоную використовувати joda-time, оскільки його набагато приємніший і зрозуміліший API порівняно з погано розробленими датами та календарями, які Java пропонує безпосередньо.
Кайцу

Я віддаю перевагу цьому, особливо в i18n роботі, щоб отримати startTime або endTime:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Едді,

1
Значна частина функцій java.time повертається до Java 6 та 7 у проекті ThreeTen-Backport .
Василь Бурк

30

Перейдіть на час joda, і це можна зробити в три рядки

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
FYI, проект Joda-Time зараз знаходиться в обслуговуванні, його команда радить перейти до класів java.time. І Joda-Time, і java.time очолює той самий чоловік, Стівен Колборн.
Василь Бурк

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()));

Ця відповідь справді стосується питання, в якому запитували про доступ до компонентів значення дати-часу (а не до звичайних форматованих рядків).
Василь Бурк

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()- статичний метод, який повертає поточний час-дату з системних годин у часовий пояс за замовчуванням. Усі методи отримання повертають intзначення.


LocalDateTimeце саме неправильний клас для цього. Відсутня будь-яка концепція часового поясу або зсув від UTC, його не можна використовувати для відстеження конкретного моменту, це не точка на часовій шкалі. Використовуйте Instant, ZonedDateTimeабо OffsetDateTimeзамість цього.
Василь Бурк

Ти маєш рацію. Я змінив свою відповідь на використання ZonedDateTime.
Ортомала Локні

3

тл; д-р

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 класи повні рішучості наносекунд . Ваше запитання вимагає частки секунди в мілісекундах . Очевидно, ви можете розділити на мільйон, щоб усікати наносекунд до мілісекунд, ціною можливої ​​втрати даних. Або використовувати TimeUnitenum для такого перетворення.

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

DateTimeFormatter

Для створення Stringкомбінованих фрагментів тексту використовуйте DateTimeFormatterклас. Шукайте переповнення стека, щоб отримати додаткову інформацію про це.

Instant

Зазвичай найкраще відстежувати моменти в UTC. Щоб змінити зонований час дати на UTC, витягніть a 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" ). Це значення не має значення, поки ви не застосуєте часовий пояс (a ZoneId) для отримання а ZonedDateTime. Різдво відбувається спочатку в Кірібаті , потім у Новій Зеландії та на далекому Сході Азії. Через години Різдво розпочинається в Індії. Більше години в Африці та Європі. І досі не Різдво в Америці до кількох годин пізніше. Різдво, яке починається в будь-якому одному місці, має бути представлене ZonedDateTime. Різдво скрізь представлено а LocalDateTime.


Про java.time

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

Час Джода , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .

Щоб дізнатися більше, див навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .

Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте a драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає необхідності в струнах, немає потреби в java.sql.*заняттях.

Де отримати класи java.time?


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.
Василь Бурк

0

в java 7 Календар один рядок

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

1
Смутні класи Календар та SimpleDateFormat тепер застарілі, повністю витіснені класами java.time. Дивіться відповідь BalusC про сучасний підхід. Значна частина функцій java.time повертається до Java 6 та 7 у проекті ThreeTen-Backport .
Василь Бурк

-2

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


FYI, тривожні старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Василь Бурк

-2

Календар зараз = новий Календар () // або новий GregorianCalendar (), або будь-який смак, який вам потрібен

зараз.MONTH зараз.HOUR

тощо.


3
Привіт, мені важко зрозуміти, чому ти погано повторюєш вже дану відповідь. Будь ласка, докладно:
BalusC

3
MONTHі HOURє статичними константами властивостей Calendar, а не екземплярів.
Джозеф Граф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.