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

时间:2010-04-16 15:10:52

标签: java date

如何获取Java中当前时刻的年,月,日,小时,分钟,秒和毫秒?我希望将它们作为Strings

10 个答案:

答案 0 :(得分:233)

您可以使用java.time.LocalDateTime的getter。

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.DateTimeFormattertutorial here),

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
Fri, 16 Apr 2010 15:15:17 GMT
20100416151517

另见:

答案 1 :(得分:29)

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

答案 2 :(得分:6)

使用Java 8及更高版本,使用java.time package

ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();

ZonedDateTime.now()是一个静态方法,在默认时区中从系统时钟返回当前日期时间。所有get方法都返回int值。

答案 3 :(得分:5)

awdr     2   
bfggd    2   
45fggd   3   

答案 4 :(得分: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()));
    }
}

答案 5 :(得分:2)

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

时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。

如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将desired/expected time zone明确指定为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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 类解析为nanoseconds。您的问题要求在milliseconds中花费一秒钟的时间。显然,您可以将整数除以一百万以将纳秒截断为毫秒,这可能会丢失数据。或使用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" )开始。在您应用时区(ZoneId)以获得ZonedDateTime之前,该值没有意义。圣诞节首先在Kiribati发生,然后在新西兰和远东亚洲发生。几个小时后,圣诞节开始在印度举行。一小时后,在非洲和欧洲。直到几个小时后,美洲地区的圣诞节仍然没有。在任何一个一个地方开始的圣诞节都应以ZonedDateTime表示。圣诞节无处不在LocalDateTime表示。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

答案 6 :(得分:0)

java 7中的

一行

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

答案 7 :(得分:0)

使用格式“ dd-MM-yyyy HH:mm:ss aa”将日期设置为 2020-10-10 20:53:42 pm

答案 8 :(得分:-2)

查看java.util.Calendar类及其衍生物的API文档(您可能对GregorianCalendar类特别感兴趣)。

答案 9 :(得分:-2)

现在的日历=新的日历()//或新的GregorianCalendar(),或者你需要的任何风格

now.MONTH now.HOUR