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


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.