วิธีการรับเวลาปัจจุบันในรูปแบบ YYYY-MM-DD HH: MI: Sec.Millisecond ใน Java?


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: ก.ล.ต. )

แต่ฉันต้องการดึงเวลาปัจจุบันในรูปแบบ2009-09-22 16:47:08.128((YYYY-MM-DD HH: MI: Sec.Ms) - ที่ 128 บอกมิลลิวินาที

SimpleTextFormatจะทำงานได้ดี หน่วยเวลาที่สั้นที่สุดคือวินาที แต่ฉันจะได้รับมิลลิวินาทีได้อย่างไร


32
เมื่อทุกคนอื่นไม่อ่านเอกสาร
เลียร้อน

4
FYI, ลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleTextFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียน ดูการสอนโดยออราเคิล
Basil Bourque

คำตอบ:


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

7
SimpleDateFormat ไม่ใช่เธรดที่ปลอดภัย แต่ DateTimeFormatter ที่ใหม่กว่านั้นเป็นเธรดที่ปลอดภัย
devdanke

15
ใช้ Java 8 datetime 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
LocalDateTime และ DateTimeFormatter เป็น thread-safe ซึ่งแตกต่างจาก SimpleDateFormat
Maxple

@ Maxple กรณีใด ๆ ที่ SimpleDateFormat ทำให้เกิดปัญหา?
gaurav

1
@gaurav นี่คือคุกกี้ของคุณ: callicoder.com/java-simpledateformat-thread-safety-issues
kidnan1991



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

ใน Java 8 และใหม่กว่าเรามีเฟรมเวิร์กjava.time ที่สร้างขึ้นใน Java 8 และใหม่กว่า คลาสใหม่เหล่านี้แทนที่คลาส java.util.Date/.Calendar เก่าที่ลำบาก คลาสใหม่นี้ได้รับแรงบันดาลใจจากกรอบการทำงานของJoda-Time ที่ประสบความสำเร็จอย่างสูงซึ่งมีจุดประสงค์เพื่อเป็นตัวตายตัวแทนซึ่งคล้ายกับแนวคิด แต่ได้รับการออกแบบใหม่ กำหนดโดยJSR 310 ขยายโดยThreeTen-พิเศษโครงการ ดูการสอน

โปรดทราบว่า java.time มีความสามารถในการแก้ปัญหาระดับนาโนวินาที (9 ตำแหน่งทศนิยมในเสี้ยววินาที) เทียบกับความละเอียดระดับมิลลิวินาที (ทศนิยม 3 ตำแหน่ง) ของทั้ง java.util.Date และ Joda-Time ดังนั้นเมื่อจัดรูปแบบเพื่อแสดงทศนิยม 3 ตำแหน่งคุณอาจซ่อนข้อมูลได้

หากคุณต้องการกำจัดไมโครวินาทีหรือนาโนวินาทีจากข้อมูลของคุณให้ตัดทอน

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

คลาส java.time ใช้รูปแบบISO 8601ตามค่าเริ่มต้นเมื่อแยกวิเคราะห์ / สร้างสตริง Zในตอนท้ายสั้นสำหรับZuluและวิธีUTC

Instantหมายถึงช่วงเวลาในระยะเวลาใน UTC ที่มีความละเอียดได้ถึงนาโนวินาที การจับภาพช่วงเวลาปัจจุบันใน 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 เวลา

ห้องสมุด Joda-Time ที่ประสบความสำเร็จเป็นแรงบันดาลใจให้กับเฟรมเวิร์ก java.time แนะนำให้โยกย้ายไปยัง java.time เมื่อสะดวก

ISO 8601รูปแบบรวมถึงมิลลิวินาทีและเป็นค่าเริ่มต้นสำหรับJoda เวลา 2.4 ห้องสมุด

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

เมื่อวิ่ง ...

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

นอกจากนี้คุณสามารถขอเศษเสี้ยววินาทีเป็นมิลลิวินาทีหากต้องการ:

int millisOfSecond = myDateTime.getMillisOfSecond ();

9

ฉันจะใช้สิ่งนี้:

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

ตัวแปรที่dateTimeอาจจะเป็นวันที่ใด ๆ และ / หรือค่าเวลาดูJavaDoc Formatterสำหรับ


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 เวลา ,

โครงการดังกล่าวนำโดยผู้เขียน Joda-Time (Stephen Colebourne) และ Oracle ภายใต้ JSR 310 และจะปรากฏในแพ็คเกจ Java SE 8 ใหม่ java.time

แต่ตอนนี้กลายเป็นเลิกและขอให้ผู้ใช้ที่จะโยกย้ายไปใหม่joda-timejava.time

โปรดทราบว่าจาก Java SE 8 เป็นต้นไปผู้ใช้จะถูกขอให้ย้ายไปยัง java.time (JSR-310) - ส่วนหลักของ JDK ซึ่งแทนที่โครงการนี้

อย่างไรก็ตามเมื่อพูดอย่างนั้น

หากคุณมีปฏิทินเช่นคุณสามารถใช้ด้านล่างเพื่อแปลงเป็นใหม่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 = 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

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

FYI, ลำบากชะมัดเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา ดูการสอนโดยออราเคิล
Basil Bourque

อันที่จริงฉันใช้โซลูชันนี้สำหรับ Android App แต่ในการใช้ Java.time class ใน Android เราจำเป็นต้องตั้งค่า API เป็นอย่างน้อย 27 อย่างไรก็ตามขอบคุณสำหรับการแบ่งปันข้อมูล
Abhishek Sengupta

ฟังก์ชันjava.timeเกือบทั้งหมดได้รับการแบ็กพอร์ตไปยัง Java 6 & 7 ในโครงการThreeTen-Backport ที่มี API เดียวกัน ปรับให้เข้ากับ Android <26 เพิ่มเติมในโครงการThreeTenABP ดังนั้นจึงไม่มีเหตุผลใดที่จะได้สัมผัสคลาสวันเวลาอันเก่าแก่ที่น่ากลัวอีกครั้ง
Basil Bourque

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

ดูดี แต่มันเพิ่มความเข้าใจมากกว่าว่าความคิดเห็น 5 ปีของ rsinhaหรือไม่?
greybeard




0

java.text (ก่อนหน้าจาวา 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()));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.