Java에서 YYYY-MM-DD HH : MI : Sec.Millisecond 형식으로 현재 시간을 얻는 방법은 무엇입니까?


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
다른 모든 방법이 실패하면 설명서를 읽으십시오 .
— 핫 릭

4
참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleTextFormat지금 기존 에 의해 대체, java.time의 클래스. Oracle의 Tutorial을 참조하십시오 .
— 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
자바 8 날짜 API를 사용 :LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
— rsinha

202

자바 원 라이너

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는 SimpleDateFormat과 달리 스레드로부터 안전합니다
— Maxple

@ SimpleDateFormat이 문제를 일으키는 경우가 있습니까?
— 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

Java 8 이상에는 Java 8 이상에 내장 된 java.time 프레임 워크 가 있습니다 . 이 새로운 클래스는 번거로운 오래된 java.util.Date/.Calendar 클래스를 대체합니다. 새로운 클래스는 개념적으로 유사하지만 재구성 된 후계자로 의도 된 매우 성공적인 Joda-Time 프레임 워크에서 영감을 받았습니다 . JSR 310에 의해 정의됩니다 . ThreeTen-Extra에 의해 확장 프로젝트로 . 학습서를 참조하십시오 .

java.time은 나노초 가 가능합니다. java.util.Date & Joda-Time 의 밀리 초 해상도 (소수점 3 자리 )와 비교하여 해상도 (소수 초의 소수 자리 9 자리 )를 사용할 수 있습니다. 따라서 소수점 이하 세 자리 만 표시하도록 서식을 지정하면 데이터를 숨길 수 있습니다.

데이터에서 마이크로 초 또는 나노초를 제거하려면 잘립니다.

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

java.time 클래스는 문자열 구문 분석 / 생성시 기본적으로 ISO 8601 형식을 사용 합니다. Z끝에 있는 A 는 짧고 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-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

가장 쉬운 방법은 (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 의 도움으로 개발되었으며 ,

이 프로젝트는 JSR 310에 따라 Joda-Time (Stephen Colebourne)과 Oracle의 저자가 공동으로 이끌 었으며 새로운 Java SE 8 패키지 java.time에 나타날 것입니다.

그러나 이제는 joda-time더 이상 사용되지 않으며 사용자에게 new로 마이그레이션하도록 요청했습니다 java.time.

Java SE 8부터는이 프로젝트를 대체하는 JDK의 핵심 부분 인 java.time (JSR-310)으로 마이그레이션하라는 메시지가 표시됩니다.

어쨌든,

캘린더 인스턴스 가있는 경우 아래를 사용하여 새 인스턴스로 변환 할 수 있습니다 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


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.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 을 참조하십시오 .
— 바질 부르 케

실제로 나는이 솔루션을 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 살짜리 주석 에 대한 통찰력을 추가 합니까?
— greybeard


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()));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.