programing

epoch에서 날짜 형식 변환

randomtip 2021. 1. 18. 07:55
반응형

epoch에서 날짜 형식 변환


다음과 같은 날짜 형식의 문자열이 있습니다.

Jun 13 2003 23:11:52.454 UTC

밀리 세크가 포함되어 있습니다. 획기적으로 변환하고 싶습니다. 이 변환을 수행하는 데 사용할 수있는 Java 유틸리티가 있습니까?


이 코드는 java.text.SimpleDateFormat 을 사용 하여 문자열에서 java.util.Date 를 구문 분석하는 방법을 보여줍니다 .

String str = "Jun 13 2003 23:11:52.454 UTC";
SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz");
Date date = df.parse(str);
long epoch = date.getTime();
System.out.println(epoch); // 1055545912454

Date.getTime() 에포크 시간을 밀리 초 단위로 반환합니다.


새로운 Java 8 API를 사용할 수도 있습니다.

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class StackoverflowTest{
    public static void main(String args[]){
        String strDate = "Jun 13 2003 23:11:52.454 UTC";
        DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz");
        ZonedDateTime     zdt  = ZonedDateTime.parse(strDate,dtf);        
        System.out.println(zdt.toInstant().toEpochMilli());  // 1055545912454  
    }
}

DateTimeFormatter클래스는 이전을 대체합니다 SimpleDateFormat. 그런 다음 ZonedDateTime원하는 epoch 시간을 추출 할 수있는를 만들 수 있습니다 .

가장 큰 장점은 이제 스레드로부터 안전하다는 것입니다.

그의 발언과 제안에 대해 Basil Bourque에게 감사드립니다. 자세한 내용은 그의 답변을 읽으십시오.


tl; dr

ZonedDateTime.parse( 
                        "Jun 13 2003 23:11:52.454 UTC" , 
                        DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" ) 
                    )
              .toInstant()
              .toEpochMilli()

1055545912454

java.time

이 답변 은 Lockni 의 답변에서 확장됩니다 .

DateTimeFormatter

먼저 DateTimeFormatter개체 를 만들어 입력 문자열과 일치하는 형식 지정 패턴을 정의 합니다.

String input = "Jun 13 2003 23:11:52.454 UTC";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" );

ZonedDateTime

문자열을 ZonedDateTime. 해당 클래스를 ( Instant+ ZoneId) 로 생각할 수 있습니다 .

ZonedDateTime zdt = ZonedDateTime.parse ( "Jun 13 2003 23:11:52.454 UTC" , f );

zdt.toString () : 2003-06-13T23 : 11 : 52.454Z [UTC]

최신 java.time과 레거시의 날짜-시간 클래스 유형 표.

시대부터 카운트

날짜-시간 값을 시대 로부터의 카운트로 추적하지 않는 것이 좋습니다 . 그렇게하면 인간이 숫자에서 의미있는 날짜-시간을 식별 할 수 없어서 잘못된 / 예기치 않은 값이 빠져 나갈 수 있으므로 디버깅이 까다로워집니다. 또한 이러한 카운트는 세분성 (전체 초, 밀리, 마이크로, 나노 등) 및 에포크 (다양한 컴퓨터 시스템에서 최소 24 인치)에서 모호합니다.

But if you insist you can get a count of milliseconds from the epoch of first moment of 1970 in UTC (1970-01-01T00:00:00) through the Instant class. Be aware this means data-loss as you are truncating any nanoseconds to milliseconds.

Instant instant = zdt.toInstant ();

instant.toString(): 2003-06-13T23:11:52.454Z

long millisSinceEpoch = instant.toEpochMilli() ; 

1055545912454


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.* classes.

Where to obtain the java.time classes?

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.


Create Common Method to Convert String to Date format

public static void main(String[] args) throws Exception {
    long test = ConvertStringToDate("May 26 10:41:23", "MMM dd hh:mm:ss");
    long test2 = ConvertStringToDate("Tue, Jun 06 2017, 12:30 AM", "EEE, MMM dd yyyy, hh:mm a");
    long test3 = ConvertStringToDate("Jun 13 2003 23:11:52.454 UTC", "MMM dd yyyy HH:mm:ss.SSS zzz");
}

private static long ConvertStringToDate(String dateString, String format) {
    try {
        return new SimpleDateFormat(format).parse(dateString).getTime();
    } catch (ParseException e) {}
    return 0;
}

  String dateTime="15-3-2019 09:50 AM" //time should be two digit like 08,09,10 
   DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm a");
        LocalDateTime zdt  = LocalDateTime.parse(dateTime,dtf);
        LocalDateTime now = LocalDateTime.now();
        ZoneId zone = ZoneId.of("Asia/Kolkata");
        ZoneOffset zoneOffSet = zone.getRules().getOffset(now);
        long a= zdt.toInstant(zoneOffSet).toEpochMilli();
        Log.d("time","---"+a);

링크에서 영역 ID를 얻을 수 있습니다 !

참조 URL : https://stackoverflow.com/questions/6687433/convert-a-date-format-in-epoch

반응형