关于日期:如何获取YYYY-MM-DD中的当前时间HH:MI:Sec.Millisecond格式的Java?

How to get the current time in YYYY-MM-DD HH:MI:Sec.Millisecond format in Java?

下面的代码给出了当前时间。 但它没有告诉任何关于毫秒的事情。

1
2
3
4
5
6
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会正常工作。 这里最低的时间单位是秒,但我如何获得毫秒?


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


Java one liner

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

在JDK8风格

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


您只需在日期格式字符串中添加毫秒字段:

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

SimpleDateFormat的API文档详细描述了格式字符串。


试试这个:-

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

1
2
3
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
Date date = new Date();
System.out.println(dateFormat.format(date));

要么

1
2
3
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));

TL;博士

1
2
Instant.now()
       .toString()

2016-05-06T23:24:25.694Z

1
2
3
4
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和amp;的毫秒分辨率(3位小数)。乔达时间。因此,当格式化只显示3个小数位时,您可能隐藏数据。

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

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

在解析/生成字符串时,java.time类在默认情况下使用ISO 8601格式。最后的ZZulu的缩写,表示UTC。

Instant表示UTC时间轴上的时刻,分辨率最高为纳秒。捕获Java 8中的当前时刻仅限于毫秒,Java 9中的新实现可捕获高达纳秒,具体取决于计算机的硬件时钟能力。

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

2016-05-06T23:24:25.694Z

将空格中的T替换为空格,将Z替换为空格,以获得所需的输出。

1
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

由于您不关心包含偏移量或时区,因此请将"本地"日期时间与任何特定位置无关。

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

乔达时间

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

ISO 8601格式包括毫秒,是Joda-Time 2.4库的默认格式。

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

跑的时候......

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

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

1
int millisOfSecond = myDateTime.getMillisOfSecond ();

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

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

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

因此,在Java 8中,类似下面的内容将起到作用(格式化当前日期/时间),

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

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

The project has been led jointly by the author of Joda-Time (Stephen Colebourne) and Oracle, under JSR 310, and will appear in the new Java SE 8 package java.time.

但现在joda-time已被弃用,并要求用户迁移到新的java.time

Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project

不管怎么说,

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

1
2
3
4
5
6
7
8
9
    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对象,

1
2
3
4
5
6
7
8
9
    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

如果你刚刚有了纪元毫秒,

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


我会用这样的东西:

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

变量dateTime可以是任何日期和/或时间值,请参阅JavaDoc for Formatter


为了补充上述答案,这里是一个打印当前时间和日期(包括毫秒)的程序的小工作示例。

1
2
3
4
5
6
7
8
9
10
11
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);
    }
}


我没有看到对此的引用:

1
SimpleDateFormat f = new SimpleDateFormat("yyyyMMddHHmmssSSS");

以上格式也很有用。

http://www.java2s.com/Tutorials/Java/Date/Date_Format/Format_date_in_yyyyMMddHHmmssSSS_format_in_Java.htm


使用此选项以指定的格式获取当前时间:

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


Java 8中的doc将其命名为second of second,而Java 6中的doc则命名为millisecond。这让我感到困惑


您可以简单地以您想要的格式获取它。

1
String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));