Ответы:
Для этого вы можете использовать геттеры 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-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).
// 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()
- статический метод, возвращающий текущую дату и время из системных часов в часовом поясе по умолчанию. Все методы get возвращают 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 классы полны решимости наносекунд . В вашем вопросе запрашивается доля секунды в миллисекундах . Очевидно, вы можете разделить на миллион, чтобы сократить наносекунды до миллисекунд за счет возможной потери данных. Или используйте TimeUnit
перечисление для такого преобразования.
long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;
DateTimeFormatter
Чтобы создать a String
для объединения фрагментов текста, используйте DateTimeFormatter
class. Найдите в Stack Overflow дополнительную информацию.
Instant
Обычно лучше всего отслеживать моменты в формате UTC. Чтобы перейти от зонированной даты и времени к UTC, извлеките файл 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" )
. Это значение не имеет значения, пока вы не примените часовой пояс (а ZoneId
) для получения ZonedDateTime
. Рождество происходит сначала на Кирибати , затем в Новой Зеландии и на Дальнем Востоке Азии. Через несколько часов в Индии начинается Рождество. Еще час спустя в Африке и Европе. И все же Рождество в Америке появится несколько часов спустя. Рождество , начиная с любого одного места должны быть представлены ZonedDateTime
. Рождество везде представлено с изображением LocalDateTime
.
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер 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 Calendar одна строка
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 .
Calendar now = new Calendar () // или new GregorianCalendar (), или любой другой вкус, который вам нужен
сейчас.МЕСЯЦ сейчас.ЧАС
и т.п.
MONTH
и HOUR
являются статическими константами Calendar
, а не свойствами экземпляра.