如何在Java中获取当前时刻的年,月,日,小时,分钟,秒和毫秒?


104

如何在Java中获取当前时刻的年,月,日,时,分,秒和毫秒?我想把它们当作Strings

Answers:


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

要转换intString,请使用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
2010年4月16日,星期五,格林尼治标准时间15:15:17
20100416151517

也可以看看:


如果要使用printf,则最好只使用日期/时间格式,而不要使用中间步骤,例如“%1 $ tm%1 $ te,%1 $ tY”,c(请参阅java.util。完整语法的格式化程序)
M. Jessup

1
@M。杰西普:确实更好。但是,我从未使用过它,所以我无法从头开始输入它,上面的内容只是出于演示目的。无论如何,我宁愿抢夺SimpleDateFormat还是DateTimeFormatter要完成特定任务:)
BalusC 2010年

我强烈建议您使用joda-time,因为与Java直接提供的设计不当的Dates和Calendars相比,它的API更好,更易于理解。
Kaitsu 2012年

我更喜欢这一点,尤其是在i18n工作中,以获得startTime或endTime:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Eddy

1
ThreeTen-Backport项目中,许多java.time功能都被反向移植到Java 6和7 。
罗勒·布尔克

30

切换到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)。


1
仅供参考,Joda-Time项目现在正在维护中,其团队建议迁移到java.time类。Joda-Time和java.time都由同一个人Stephen Colebourne领导。
罗勒·布尔克

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()是一种静态方法,它以默认时区从系统时钟返回当前日期时间。所有的get方法都返回一个int值。


LocalDateTime恰恰是错误的类别。缺少任何时区或UTC偏移概念,它不能用于跟踪特定时刻,它不是时间线上的一点。使用InstantZonedDateTimeOffsetDateTime代替。
罗勒·布尔克

你是对的。我已将答案修改为使用ZonedDateTime
Ortomala Lokni

3

tl; dr

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/MontrealAfrica/CasablancaPacific/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时,你打算日期和时间适用于任何地方各地方,而不是一个特定的地方。

例如,今年圣诞节始于LocalDateTime.parse( "2018-12-25T00:00:00" )。该值在您应用时区(a ZoneId)以获得a 之前没有任何意义ZonedDateTime。圣诞节首先在基里巴斯举行,然后在新西兰和远东亚洲举行。几个小时后,圣诞节开始在印度举行。一小时后在非洲和欧洲。直到几个小时后,美洲地区的圣诞节仍然没有。从任何一个地方开始的圣诞节应该用表示ZonedDateTime。圣诞节到处都有一个节日LocalDateTime


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要类。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,随着JDBC 4.2的到来而java.sql.Timestamp被取代java.time.Instant
罗勒·布尔克

0

在Java 7日历中一行

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

1
麻烦的Calendar和SimpleDateFormat类现在已过时,完全被java.time类所取代。有关现代方法,请参见BalusC的答案。在ThreeTen-Backport项目中,许多java.time功能都被反向移植到Java 6和7 。
罗勒·布尔克


-2

现在的日历= new Calendar()//或new GregorianCalendar(),或您需要的任何样式

现在。MONTH

等等


3
嗨,我很难理解您为什么以糟糕的方式重复已经给出的答案。请详细说明:)
BalusC 2010年

3
MONTHHOUR是的静态常量Calendar,而不是实例属性。
约瑟夫·厄尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.