如何在Java中以YYYY-MM-DD HH:MI:秒毫秒格式获取当前时间?


641

下面的代码为我提供了当前时间。但这并不能说明毫秒。

public static String getCurrentTimeStamp() {
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//dd/MM/yyyy
    Date now = new Date();
    String strDate = sdfDate.format(now);
    return strDate;
}

我以2009-09-22 16:47:08 (YYYY-MM-DD HH:MI:Sec)格式获取日期。

但是我想以2009-09-22 16:47:08.128((YYYY-MM-DD HH:MI:Sec.Ms))格式检索当前时间,其中128表示毫秒。

SimpleTextFormat会很好的工作。在这里,最小的时间单位是秒,但是如何获得毫秒呢?


32
如果所有其他方法均失败,请阅读文档
Hot Licks

4
仅供参考,麻烦的旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat现在的遗产,由取代java.time类。请参见Oracle教程
罗勒·布尔克

Answers:


1003
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

出于好奇,使用SimpleDateFormat带来的好处是:dateTime.ToString(“ yyyy-MM-dd HH:mm:ss.SSS”)吗?
NickG

10
@NickG这种toString(String format)方法在哪里?在java.util.Date似乎并不拥有它。您是指Joda Time API吗?但是一个可能的好处是重用了相同的格式化对象。另一个是您不必添加API-Date类是标准的Java库类。
ADTC

22
在Java 8中,您可以将DateTimeFormatter用于相同的目的。
Vitalii Fedorenko 2014年

7
SimpleDateFormat不是线程安全的,但是较新的DateTimeFormatter是线程安全的。
devdanke '17

15
使用Java 8日期时间API:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha

202

Java一线

public String getCurrentTimeStamp() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
}

以JDK8风格

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}

9
与SimpleDateFormat不同,LocalDateTime和DateTimeFormatter是线程安全的
Maxple

@Maxple SimpleDateFormat引起问题的任何情况?
gaurav




30

tl; dr

Instant.now()
       .toString()

2016-05-06T23:24:25.694Z

ZonedDateTime
.now
( 
    ZoneId.of( "America/Montreal" ) 
)
.format(  DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )

2016-05-06 19:24:25.694

java.time

在Java 8和更高版本中,我们在Java 8和更高版本中内置了java.time框架。这些新类取代了麻烦的旧java.util.Date/.Calendar类。新课程的灵感来自极为成功的Joda-Time框架,该框架旨在作为其继任者,其概念相似但已重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅教程

请注意,java.time的解析度为纳秒秒的小数位为9个小数位),而java.util.Date和Joda-Time的解析度为毫秒(小数点后3位)。因此,当格式化仅显示小数点后3位时,您可能会隐藏数据。

如果要从数据中消除任何微秒或纳秒,请截断。

Instant instant2 = instant.truncatedTo( ChronoUnit.MILLIS ) ;

解析/生成字符串时,java.time类默认使用ISO 8601格式。Z末尾的A Zulu表示UTC

An Instant代表UTC时间线上的一个时刻,分辨率最高为ns。Java 8中捕获当前时刻的时间限制为毫秒,而Java 9中的新实现则可以捕获纳秒的时间,具体取决于计算机硬件时钟的能力。

Instant instant = Instant.now (); // Current date-time in UTC.
String output = instant.toString ();

2016-05-06T23:24:25.694Z

T空格代替中间的Z,不要用代替,以得到所需的输出。

String output = instant.toString ().replace ( "T" , " " ).replace( "Z" , "" ; // Replace 'T', delete 'Z'. I recommend leaving the `Z` or any other such [offset-from-UTC][7] or [time zone][7] indicator to make the meaning clear, but your choice of course.

2016-05-06 23:24:25.694

由于您不必考虑包含偏移量或时区,因此请使“本地”日期时间与任何特定位置无关。

String output = LocalDateTime.now ( ).toString ().replace ( "T", " " );

乔达时代

极为成功的Joda-Time库是java.time框架的灵感来源。建议在方便时迁移到java.time。

ISO 8601的格式包含毫秒,对于默认的乔达时间 2.4库。

System.out.println( "Now: " + new DateTime ( DateTimeZone.UTC ) );

运行时...

Now: 2013-11-26T20:25:12.014Z

另外,如果需要,您可以要求毫秒的毫秒数作为数字:

int millisOfSecond = myDateTime.getMillisOfSecond ();

9

最简单的方法是(在Java 8之前)使用,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

但是SimpleDateFormat不是线程安全的。都不是java.util.Date。这将导致用户潜在的并发问题。在这些现有设计中存在许多问题。为了在Java 8中克服这些问题,我们有一个单独的包java.time。该Java SE 8日期和时间文档对此有很好的概述。

因此,在Java 8中,以下方法可以解决问题(格式化当前日期/时间),

LocalDateTime.now()
   .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

要注意的一件事是,它是在受欢迎的第三方图书馆joda-time的帮助下开发的,

该项目由Joda-Time(Stephen Colebourne)的作者和Oracle在JSR 310下共同领导,并将出现在新的Java SE 8包java.time中。

但是现在joda-time不推荐使用,并要求用户迁移到新的java.time

请注意,从Java SE 8开始,要求用户迁移到java.time(JSR-310)-JDK的核心部分,该项目取代了此项目。

无论如何,

如果您有一个Calendar实例,则可以在下面使用该实例将其转换为新的java.time

    Calendar calendar = Calendar.getInstance();
    long longValue = calendar.getTimeInMillis();         

    LocalDateTime date =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());
    String formattedString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(date.toString()); // 2018-03-06T15:56:53.634
    System.out.println(formattedString); // 2018-03-06 15:56:53.634

如果您有一个Date对象,

    Date date = new Date();
    long longValue2 = date.getTime();

    LocalDateTime dateTime =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue2), ZoneId.systemDefault());
    String formattedString = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(dateTime.toString()); // 2018-03-06T15:59:30.278
    System.out.println(formattedString);     // 2018-03-06 15:59:30.278

如果只有纪元毫秒,

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());

最低API级别为26
AbhinayMe,

8

我会用这样的东西:

String.format("%tF %<tT.%<tL", dateTime);

变量dateTime可以是任何日期和/或时间值,请参见JavaDocFormatter


4

为了补充上面的答案,这是一个程序的小示例,该程序显示当前时间和日期,包括毫秒。

import java.text.SimpleDateFormat;
import java.util.Date;

public class test {
    public static void main(String argv[]){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date now = new Date();
        String strDate = sdf.format(now);
        System.out.println(strDate);
    }
}


2

使用此命令以指定格式获取当前时间

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }

仅供参考,麻烦的旧日期时间类(如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在已成为旧版)被Java 8及更高版本中内置的java.time类取代。请参见Oracle 教程
罗勒·布尔克

实际上,我是在Android App上使用此解决方案,但是要在Android中使用Java.time类,我们需要将API至少设置为27。无论如何,感谢您共享信息。
Abhishek Sengupta

几乎所有的java.time功能都使用相同的API 反向移植到ThreeTen-Backport项目中的Java 6和7中。在ThreeTenABP项目中进一步适用于Android <26 。因此,没有理由再次触及那些血腥的糟糕的旧日期时间类。
罗勒·布尔克

2

我这里有一个简单的示例,以毫秒为单位显示日期和时间……

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class MyClass{

    public static void main(String[]args){
        LocalDateTime myObj = LocalDateTime.now();
        DateTimeFormatter myFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS);
        String forDate = myObj.format(myFormat);
        System.out.println("The Date and Time are: " + forDate);
    }
}

看起来不错,但这是否能为rsinha的5岁评论增加见识?
灰胡子


1

答:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
ZonedDateTime start = Instant.now().atZone(ZoneId.systemDefault());
String startTimestamp = start.format(dateFormatter);


0

java.text(Java 8之前的版本)

public static ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    };
};

...
dateFormat.get().format(new Date());

java.time

public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

...
dateTimeFormatter.format(LocalDateTime.now());

-1

您可以简单地以所需的格式获取它。

String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));
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.