Làm cách nào để có được thời gian hiện tại ở định dạng YYYY-MM-DD HH: MI: Sec.Millisecond trong Java?


641

Mã dưới đây cho tôi thời gian hiện tại. Nhưng nó không nói lên điều gì về mili giây.

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;
}

Tôi nhận được ngày ở định dạng 2009-09-22 16:47:08 (YYYY-MM-DD HH: MI: Sec) .

Nhưng tôi muốn lấy lại thời gian hiện tại ở định dạng 2009-09-22 16:47:08.128((YYYY-MM-DD HH: MI: Sec.Ms) - trong đó 128 cho biết mili giây.

SimpleTextFormatsẽ hoạt động tốt Ở đây đơn vị thời gian thấp nhất là thứ hai, nhưng làm thế nào để tôi có được mili giây?


32
Khi thất bại, đọc tài liệu .
Hot Licks

4
FYI, người già lớp ngày thời gian phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleTextFormatbây giờ là di sản , thay thế bởi sự java.time lớp. Xem Hướng dẫn của Oracle .
Basil Bourque

Câu trả lời:


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

Vì tò mò, việc sử dụng SimpleDateFormat mang lại lợi ích gì cho: dateTime.ToString ("yyyy-MM-dd HH: mm: ss.SSS")?
NickG

10
@NickG toString(String format)Phương pháp này ở đâu? Các java.util.Datedường như không có nó. Bạn đang đề cập đến API thời gian Joda? Nhưng một lợi ích có thể là tái sử dụng của cùng một đối tượng định dạng. Một điều nữa là bạn không phải thêm API - Lớp ngày là lớp thư viện Java tiêu chuẩn.
ADTC

22
Trong Java 8, bạn có thể sử dụng DateTimeFormatter cho cùng một mục đích.
Vitalii Fedorenko

7
SimpleDateFormat không phải là luồng an toàn, nhưng DateTimeFormatter mới hơn là luồng an toàn.
devdanke

15
Sử dụng API datetime Java 8:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha

202

Một lớp lót Java

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

theo kiểu JDK8

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

9
LocalDateTime và DateTimeFormatter an toàn theo luồng không giống như SimpleDateFormat
Maxple

@Maxple có trường hợp nào SimpleDateFormat gây ra sự cố không?
gaurav




31

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

Trong Java 8 trở lên, chúng ta có khung java.time được tích hợp vào Java 8 trở lên. Các lớp mới này thay thế các lớp java.util.Date/.CalWiki cũ rắc rối. Các lớp mới được lấy cảm hứng từ khuôn khổ Joda-Time rất thành công , dự định là người kế thừa của nó, tương tự về khái niệm nhưng được tái kiến ​​trúc. Được xác định bởi JSR 310 . Mở rộng bởi dự án ThreeTen-Extra . Xem hướng dẫn .

Xin lưu ý rằng java.time có khả năng phân giải nano giây (9 vị trí thập phân trong một phần giây), so với độ phân giải mili giây (3 vị trí thập phân) của cả java.util.Date & Joda-Time. Vì vậy, khi định dạng chỉ hiển thị 3 chữ số thập phân, bạn có thể ẩn dữ liệu.

Nếu bạn muốn loại bỏ bất kỳ micro giây hoặc nano giây khỏi dữ liệu của mình, hãy cắt bớt.

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

Các lớp java.time sử dụng định dạng ISO 8601 theo mặc định khi phân tích cú pháp / tạo chuỗi. A Zở cuối là viết tắt của Zulu, và có nghĩa là UTC .

An Instantđại diện cho một khoảnh khắc trên dòng thời gian trong UTC với độ phân giải lên tới nano giây . Việc ghi lại khoảnh khắc hiện tại trong Java 8 bị giới hạn ở một phần nghìn giây , với việc triển khai mới trong Java 9 thu được tới nano giây tùy thuộc vào khả năng của đồng hồ phần cứng máy tính của bạn.

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

2016-05-06T23: 24: 25.694Z

Thay thế Tở giữa bằng một khoảng trắng và Zkhông có gì để có đầu ra mong muốn của bạn.

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

Vì bạn không quan tâm đến việc bao gồm phần bù hoặc múi giờ, hãy đặt ngày giờ "cục bộ" không liên quan đến bất kỳ địa phương cụ thể nào.

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

Joda-Thời gian

Thư viện Joda-Time rất thành công là nguồn cảm hứng cho khung java.time. Nên di chuyển sang java.time khi thuận tiện.

Các tiêu chuẩn ISO 8601 định dạng bao gồm mili giây, và là mặc định cho các Joda thời gian 2,4 thư viện.

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

Khi chạy đào

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

Ngoài ra, bạn có thể yêu cầu một phần nghìn giây của một giây, nếu cần:

int millisOfSecond = myDateTime.getMillisOfSecond ();


9

Cách dễ nhất là sử dụng (trước Java 8),

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

Nhưng SimpleDateFormat không an toàn cho chuỗi. Cả java.util.Date . Điều này sẽ dẫn đến các vấn đề tương tranh tiềm ẩn cho người dùng. Và có nhiều vấn đề trong những thiết kế hiện có. Để khắc phục những điều này ngay bây giờ trong Java 8, chúng tôi có một gói riêng gọi là java.time . Đây Java SE 8 Ngày và Giờ tài liệu có một cái nhìn tổng quan tốt về nó.

Vì vậy, trong Java 8, một cái gì đó như dưới đây sẽ thực hiện thủ thuật (để định dạng ngày / giờ hiện tại),

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

Và một điều cần lưu ý là nó được phát triển với sự giúp đỡ của thư viện bên thứ ba nổi tiếng , thời gian ,

Dự án đã được dẫn dắt bởi tác giả của Joda-Time (Stephen Colebourne) và Oracle, dưới JSR 310, và sẽ xuất hiện trong gói Java SE 8 mới java.time.

Nhưng bây giờ, joda-timenó đang trở nên phản đối và yêu cầu người dùng chuyển sang mới java.time.

Lưu ý rằng từ Java SE 8 trở đi, người dùng được yêu cầu di chuyển sang java.time (JSR-310) - một phần cốt lõi của JDK thay thế cho dự án này

Dù sao cũng đã nói rằng,

Nếu bạn có một phiên bản Lịch, bạn có thể sử dụng bên dưới để chuyển đổi nó thành mới 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

Nếu bạn có một đối tượng 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

Nếu bạn chỉ có một phần nghìn giây,

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

cấp API tối thiểu là 26
AbhinayMe

4

Để bổ sung cho các câu trả lời ở trên, đây là một ví dụ nhỏ về chương trình in thời gian và ngày hiện tại, bao gồm cả mili giây.

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

Sử dụng điều này để có được thời gian hiện tại của bạn ở định dạng được chỉ định:

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

FYI, người già lớp ngày thời gian khủng khiếp phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản , thay thế bởi sự java.time class built vào Java 8 và sau đó. Xem Hướng dẫn của Oracle .
Basil Bourque

Thật ra tôi đang sử dụng giải pháp này cho Ứng dụng Android, nhưng để sử dụng lớp Java.time trong Android, chúng ta cần phải đặt API ít nhất là 27. Dù sao cũng cảm ơn vì đã chia sẻ thông tin.
Abhishek Sengupta

Gần như tất cả các chức năng của java.time được chuyển ngược lại sang Java 6 & 7 trong dự án ThreeTen-Backport với hầu như cùng một API. Thích nghi hơn nữa với Android <26 trong dự án ThreeTenABP . Vì vậy, không có lý do gì để chạm vào những lớp thời gian cũ đẫm máu khủng khiếp đó một lần nữa.
Basil Bourque

2

Tôi có một ví dụ đơn giản ở đây để hiển thị ngày và giờ với Millisecond ......

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);
    }
}

Có vẻ tốt, nhưng nó có thêm cái nhìn sâu sắc hơn, giả sử, nhận xét 5 năm của rsinha ?
greybeard


1

Trả lời:

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

0

Tài liệu trong Java 8 đặt tên nó là một phần giây , trong khi trong Java 6 được đặt tên là mili giây . Điều này khiến tôi bối rối


0

java.text (trước 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

Bạn chỉ có thể có được nó trong định dạng bạn muốn.

String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.