Відповіді:
Ви можете використовувати для цього геттери 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
SimpleDateFormatабо DateTimeFormatterдля цього конкретного завдання :)
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Перейдіть на час 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).
// 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()));
З 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.
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 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.
Час Джода , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .
Щоб дізнатися більше, див навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте a драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає необхідності в струнах, немає потреби в java.sql.*заняттях.
Де отримати класи java.time?
Або використовувати 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()));
}
}
new Date()тут. Але як би ви отримали окремі частини від неї легко, як вимагали?
java.sql.Timestampвитіснився java.time.Instantз приходом JDBC 4.2.
в java 7 Календар один рядок
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
Перегляньте документацію API для класу java.util.Calendar та його похідних (вас може зацікавити конкретно клас GregorianCalendar).
java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , витіснені класами java.time, вбудованими в Java 8 та новіших версій. Дивіться Підручник від Oracle .
Календар зараз = новий Календар () // або новий GregorianCalendar (), або будь-який смак, який вам потрібен
зараз.MONTH зараз.HOUR
тощо.
MONTHі HOURє статичними константами властивостей Calendar, а не екземплярів.