현재 자정 이후의 밀리 초 수를 어떻게 알 수 있습니까?


125

나는 epoch에서 millis를 원하지 않습니다. 현재 시계의 밀리 초 수를 원합니다.

예를 들어이 코드가 있습니다.

Date date2 = new Date(); 
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);

날짜와 함께 밀리 초를 얻는 방법이 있습니까? 이를 수행하는 다른 방법이 있습니까?

참고 : System.currentTimeMillis() 내가 찾고있는 것이 아닌 epoch에서 millis를 제공합니다.


2
"밀리 초 단위"라는 뜻입니다. 값은 항상 간격 [0, 999]에 있습니다. 맞나요? @thinksteep은 마지막 문장을 읽었습니다.
Matt Ball

@Lemonio 예제를 제공하면 질문이 더 명확 해집니다.
Basil Bourque 2015 년

참고로, 귀찮은 된 날짜 - 시간 클래스는 다음과 같은 java.util.Date지금 기존 에 의해 대체, java.time의 클래스.
Basil Bourque

참고로, 귀찮은 된 날짜 - 시간 클래스는 다음과 같은 java.util.Date지금 기존 에 의해 대체, java.time의 클래스. Oracle의 Tutorial을 참조하십시오 .
Basil Bourque

1
@ChrisNeve JEP (150) 에 의해 승인 브라이언 게츠 , JSR 310은 만장일치로 채택 하는 기술 문서 새로운 오라클에 의해 출판, 오래된 날짜 - 시간 오라클 튜토리얼의 교체 java.time 자습서 .
Basil Bourque

답변:


198

무슨 뜻입니까?

long millis = System.currentTimeMillis() % 1000;

BTW Windows는 1969 년까지의 시간 여행을 허용하지 않습니다.

C:\> date
Enter the new date: (dd-mm-yy) 2/8/1969
The system cannot accept the date entered.

8
Unix 시대 이전으로 시간을 거슬러 올라가면 음수 값을 제공하지만 using c.get(Calendar.MILLISECOND)은 그렇지 않습니다. 항상 코너 케이스를 생각하십시오!
Jon Skeet

누군가가 두 번째 경계에없는 시간대를 정의하거나

35
Java는 시간 여행을 지원하지 않습니다.
R. Martinho Fernandes

1
@MarkusMikkolainen : 아니요, System.currentTimeMillis()시간대의 영향을받지 않습니다.
Jon Skeet

1
@PeterLawrey : 글쎄, 그럴 수도 아닐 수도 있습니다. 구현에 달려 있습니다. 날짜에 대한 문서에서 : "초는 0에서 61까지의 정수로 표시됩니다. 값 60과 61은 윤초에 대해서만 발생하고 실제로 윤초를 올바르게 추적하는 Java 구현에서만 발생합니다. 초가 현재 도입 되었기 때문에 같은 분에 2 개의 윤초가 발생할 가능성은 극히 적습니다. 그러나이 사양은 ISO C의 날짜 및 시간 규칙을 따릅니다. "
Jon Skeet

25

캘린더 사용

Calendar.getInstance().get(Calendar.MILLISECOND);

또는

Calendar c=Calendar.getInstance();
c.setTime(new Date()); /* whatever*/
//c.setTimeZone(...); if necessary
c.get(Calendar.MILLISECOND);

실제로는 거의 항상 System.currentTimeMillis () % 1000과 같을 것이라고 생각합니다. 누군가 윤 밀리 초를 가지고 있거나 어떤 달력이 두 번째 경계가 아닌 epoch로 정의되지 않는 한.


달력은 기본적으로 이미 현재 시간이며 MILLISECOND에는 s가 없습니다.
kgautron 2012-08-02


14

tl; dr

현재 시간의 1 초를 밀리 초 단위로 요청합니다 ( 에포크에서 계산 되지 않음 ).

Instant.now()                               // Get current moment in UTC, then…
       .get( ChronoField.MILLI_OF_SECOND )  // interrogate a `TemporalField`.

2017-04-25T03 : 01 : 14.113Z → 113

  1. 나노초 (십억) 단위의 초를 가져옵니다.
  2. 천으로 나누면 밀리 초 (천)로 자릅니다.

코드는 IdeOne.com에서 실시간으로 실행 됩니다.

java.time 사용

현대적인 방법은 java.time 클래스를 사용하는 것입니다.

UTC로 현재 순간을 캡처하십시오.

Instant.now()

Instant.get메서드를 사용하여 TemporalField. 우리의 경우 TemporalField우리가 원하는 것은 ChronoField.MILLI_OF_SECOND.

int millis = Instant.now().get( ChronoField.MILLI_OF_SECOND ) ;  // Get current moment in UTC, then interrogate a `TemporalField`.

아니면 직접 계산해보세요.

특정 시간대에 대해 요청할 가능성이 큽니다. 1 초의 비율은와 동일 할 가능성이 Instant있지만 시간대에는 이상이 너무 많아서 그 가정을하는 것이 주저합니다.

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) ;

분수 초를 조사하십시오. 질문은 밀리 초를 요구 했지만 java.time 클래스는 더 미세한 나노초 해상도를 사용합니다 . 즉, 나노초의 범위는 0에서 999,999,999까지입니다.

long nanosFractionOfSecond = zdt.getNano();

진정으로 밀리 초를 원하면 백만으로 나누어 미세한 데이터를 자릅니다. 예를 들어 0.5 초는 500,000,000 나노초이고 또한 500 밀리 초입니다.

long millis = ( nanosFractionOfSecond / 1_000_000L ) ;  // Truncate nanoseconds to milliseconds, by a factor of one million.

java.time 정보

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.

java.time 클래스는 어디서 구할 수 있습니까?

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 java.time에 향후 추가 할 수있는 가능성을 입증하는 곳입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


13

위의 몇 가지를 시도했지만 @ 1000으로 재설정되는 것 같습니다.

이것은 확실히 작동하며 년을 고려해야합니다.

long millisStart = Calendar.getInstance().getTimeInMillis();

필요한 경우 종료 시간에도 동일하게 수행합니다.


1
잘못된 질문에 대답합니다. 그것은 현재 시간의 밀리 부분이 아니라 epoch의 현재 밀리입니다.
Sean Van Gorder

5
  1. long timeNow = System.currentTimeMillis();
  2. System.out.println(new Date(timeNow));

Fri Apr 04 14:27:05 PDT 2014


3

Joda-Time

Joda-Time 을 사용 하여이 작업을 수행 할 수 있다고 생각합니다 . DateTime클래스와 그 getMillisOfSecond방법을 살펴보십시오 . 같은 것

int ms = new DateTime().getMillisOfSecond() ;

컴파일 오류 : " getMillis()has protected access"; get()대신 사용해야 합니다. 또한 new DateTime(new Date())단순히 작성하는 것과 동일합니다 new DateTime().
Jonik

메소드 millisOfSecond는 객체에 액세스하고 해당 객체에서 get기본 요소 를 추출하기위한 추가 호출을 수행 int합니다. 편리한 getter 메서드를 사용하여 두 호출을 축소 할 수 있습니다 getMillisOfSecond. Joda-Time은 많은 속성에 대해이 패턴을 따릅니다.
Basil Bourque 2015 년

1
참고로 Joda-Time 프로젝트는 이제 유지 관리 모드 에 있으며 팀은 java.time 클래스 로의 마이그레이션을 조언합니다 .
Basil Bourque

0

Java 8에서는 간단히 할 수 있습니다.

ZonedDateTime.now().toInstant().toEpochMilli()

returns : 1970-01-01T00 : 00 : 00Z 에포크 이후의 밀리 초 수


1
[A] 이것은 질문이 요구 한 것이 아닙니다 . Epoch 기준 날짜 이후로 밀리 초를 원하지 않는다고 명시 적으로 말합니다 . [B] 당신은 ZonedDateTime을 삭제하여 해당 단축 할 수 :Instant.now().toEpochMilli()
바질 우르 큐

0

Java 8을 사용하여 테스트를 수행했습니다. 빌더가 항상 0 밀리 초를 소요하는 순서와 26 ~ 33 밀리 초 사이의 연결과 1000 개의 연결을 반복하는 것은 중요하지 않습니다.

그것이 당신의 ide로 그것을 시도하는 데 도움이되기를 바랍니다.

public void count() {

        String result = "";

        StringBuilder builder = new StringBuilder();

        long millis1 = System.currentTimeMillis(),
            millis2;

        for (int i = 0; i < 1000; i++) {
            builder.append("hello world this is the concat vs builder test enjoy");
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));

        millis1 = System.currentTimeMillis();

        for (int i = 0; i < 1000; i++) {
            result += "hello world this is the concat vs builder test enjoy";
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));
    }

0

자바 8 :

LocalDateTime toDate = LocalDateTime.now();
LocalDateTime fromDate = LocalDateTime.of(toDate.getYear(), toDate.getMonth(), 
toDate.getDayOfMonth(), 0, 0, 0);
long millis = ChronoUnit.MILLIS.between(fromDate, toDate);

1
일부 시간대에서는 작동하지 않습니다. 일부 구역에서는 일부 날짜에 하루가 00:00:00에 시작되지 않을 수 있습니다. 그리고 하루는 24 시간이 아닐 수 있으며 몇 시간 또는 몇 분을 추가하거나 건너 뛸 수 있습니다. 이 LocalDateTime클래스는 시간대 또는 UTC로부터의 오프셋 개념이없는 순간을 나타낼 수 없으므로 이러한 시간대 문제를 추적 할 수 없습니다.
Basil Bourque

0

java.util.Calendar 클래스를 사용하여 밀리 초 단위로 시간을 가져올 수 있습니다. 예:

Calendar cal = Calendar.getInstance();
int milliSec = cal.get(Calendar.MILLISECOND);
// print milliSec

java.util.Date date = cal.getTime();
System.out.println("Output: " +  new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(date));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.