currentTimeMillis를 Java의 날짜로 변환하는 방법은 무엇입니까?


140

서버에서 생성 된 특정 로그 파일에 밀리 초가 있으며 로그 파일이 생성 된 로케일을 알고 있습니다. 제 문제는 밀리 초를 지정된 형식의 날짜로 변환하는 것입니다. 해당 로그 처리는 다른 시간대에있는 서버에서 발생합니다. "SimpleDateFormat"으로 변환하는 동안 포맷 날짜가 서버의 정확한 시간을 나타내지 않기 때문에 프로그램이 기계의 날짜를 가져옵니다. 이것을 우아하게 처리 할 수있는 방법이 있습니까?

long yourmilliseconds = 1322018752992l;
        //1322018752992-Nov 22, 2011 9:25:52 PM 

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

GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);

System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));

DateTime jodaTime = new DateTime(yourmilliseconds, 
                    DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");

System.out.println("jodaTime "+parser1.print(jodaTime));

산출:

Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992

로케일을 시간대와 혼동하지 마십시오. 완전히 분리되어 있습니다. 로케일은 월과 요일의 이름 및 월, 일 등의 부품 순서와 같은 문화적 규범에 대한 휴먼 언어를 결정합니다. 표준 시간대는 UTC와 오프셋 및 일광 절약 시간과 같은 예외 처리 규칙입니다.
Basil Bourque

밀리 초 수가 1970-01-01T00 : 00 : 00Z가 아니라 다른 순간의 카운트라는 문제입니까?
Basil Bourque

참고로, 끔찍한 오래된 날짜 시간 클래스 ( GregorianCalendar, SimpleDateFormat등)와 우수한 Joda-Time 라이브러리는 현대 java.time 클래스로 대체되었습니다 .
Basil Bourque

답변:


115
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);

int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);

캘린더를 최종으로 설정해야 작동합니다. final Calendar calendar = Calendar.getInstance();
Victor Augusto

4
달력 객체는 일반적으로 상당히 큰 것으로 간주되므로 가능하면 피해야합니다. 필요한 기능이 있다고 가정하면 Date 객체가 더 좋습니다. "날짜 = 새 날짜 (밀리 초);" 사용자가 다른 답변에서 제공 한 AVD는 최고의 경로가 될 것입니다 :)
Dick Lucas

1
어떻게해서 든, 1515436200000l나는 점점지고 calendar.get(Calendar.MONTH))있다 0!
Sajib Acharya

참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

2
@SajibAcharya Calendar.MONTH의 인스턴스는 0에서 시작합니다. 우리가 알고있는 "실제"달을 얻으려면 1을 추가해야합니다. 예 : 0 = 1 월, 1 = 2 월, 2 = 3 월 등
shagberg

256

java.util.Date클래스를 사용한 다음 SimpleDateFormat형식 을 지정하는 데 사용할 수 있습니다 Date.

Date date=new Date(millis);

Java SE 8에 도입 된 java.time 패키지 (자습서)-DateTime API를 사용할 수 있습니다 .

var instance = java.time.Instant.ofEpochMilli(millis);
var localDateTime = java.time.LocalDateTime
                        .ofInstant(instance, java.time.ZoneId.of("Asia/Kolkata"));
var zonedDateTime = java.time.ZonedDateTime
                            .ofInstant(instance,java.time.ZoneId.of("Asia/Kolkata"));

// Format the date

var formatter = java.time.format.DateTimeFormatter.ofPattern("u-M-d hh:mm:ss a O");
var string = zonedDateTime.format(formatter);

2
훨씬 더 효율적입니다.
채드 빙엄

2
아니. 모든 방법 java.util.Date이 감가 상각되는 것은 아닙니다 . (JDK8에서는 Date & Time API가 개선되었습니다 java.time)
adatapost

1
@RafaelZeffa, '' ''Date (long date) '' ''생성자는 더 이상 사용되지 않습니다
Gugelhupf

Date 개체는 이전 버전과의 호환성을 위해 제공됩니다. 위에서 제안한대로 캘린더를 사용하는 것이 좋습니다.
톤 스노에

2
참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

24

tl; dr

Instant.ofEpochMilli( 1_322_018_752_992L )     // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
       .atZone( ZoneId.of( "Africa/Tunis" ) )  // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.

세부

다른 답변은 낡거나 잘못된 클래스를 사용합니다.

java.util.Date/.Calendar와 같은 이전 날짜-시간 클래스를 피하십시오. 그들은 잘못 설계되고 혼란스럽고 번거로운 것으로 입증되었습니다.

java.time

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 대부분의 기능은 Java 6 & 7로 백 포트 되어 Android에 더욱 적합합니다 . Joda-Time을 만든 것과 같은 사람들 중 일부에 의해 만들어진 .

Instant있는 타임 라인에 순간 UTC 의 해상도를 가진 나노초 . 그 시대 는 UTC 1970 년의 첫 순간입니다.

입력 데이터가 1970-01-01T00 : 00 : 00Z (질문에서 명확하지 않음)에서 밀리 초 단위라고 가정하면을 쉽게 인스턴스화 할 수 있습니다 Instant.

Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );

instant.toString () : 2011-11-23T03 : 25 : 52.992Z

Z그 표준 ISO 8601 형식의 문자열에 대한 짧은 Zulu수단 UTC .

올바른 시간대 이름을 사용하여 시간대를 적용하여을 가져옵니다 ZonedDateTime.

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );

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

Asia/Kolkata 시간대?

귀하의 코드에 영향을 미치는 인도 시간대가 있다고 생각합니다. Asia/Kolkata시간대 를 조정 하면 08:55UTC 값보다 5 시간 30 분 앞선 보고서와 동일한 시간이 렌더링 03:25됩니다.

2011-11-23T08 : 55 : 52.992 + 05 : 30 [아시아 / 콜카타]

기본 영역

JVM 의 현재 기본 시간대 를 적용 할 수 있습니다 . 런타임 동안 기본값은 언제든지 변경 될 수 있습니다 . JVM 내의 모든 앱 스레드에있는 모든 코드는 현재 기본값을 변경할 수 있습니다. 중요한 경우 사용자에게 원하는 시간대를 요청하십시오.

ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

java.time에 대하여

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

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

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310입니다 입니다.

JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하면 데이터베이스와 직접 java.time 객체를 교환 할 수 있습니다. 문자열이나 java.sql. * 클래스가 필요하지 않습니다.

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

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


위에서 추천 한 순간을 장치 (예 : 스마트 폰)의 기본 시간대로 쉽게 변환 할 수 있습니까?
AJW

1
@AJW 예. 전화하십시오 ZoneId.systemDefault(). 내 답변 끝에 추가 된 새 섹션을 참조하십시오.
Basil Bourque

훌륭합니다. 시험해 볼게요.
AJW

14

가장 쉬운 방법은 Joda DateTime 클래스 를 사용하고 타임 스탬프 (밀리 초)와 원하는 DateTimeZone을 모두 지정하는 것입니다.

내장 Java Date 및 Calendar 클래스를 피하는 것이 좋습니다. 그들은 끔찍하다.


GorgianCalender는 시스템 기본 시간대를 사용하는 어떤 이유로 든 작동하지 않았습니다. Joda는 완벽하게 일했습니다.
Amit

우리가 Gregorian과 다른 것을 할 수 있다면 샘플 코드를보고 알려주십시오
Amit

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

13

JVM의 표준과 같이 1970 년 1 월 1 일 GMT 이후의 millis 값이 millis의 수이면 시간대와 무관합니다. 특정 시간대로 형식을 지정하려면 간단히 GregorianCalendar 객체로 변환하고 시간대를 설정하면됩니다. 그 후에는 여러 가지 방법으로 형식을 지정할 수 있습니다.


1
이것은 GregorianCalendar 및 Joda의 샘플 코드입니다. Joda에서는 올바른 출력을 얻지 만 Gregorian GregorianCalendar에서는 아닙니다. calendar = new GregorianCalendar (TimeZone.getTimeZone ( "US / Central")); calendar.setTimeInMillis (yourmilliseconds); DateTime jodaTime = 새로운 DateTime (yourmilliseconds, DateTimeZone.forTimeZone (TimeZone.getTimeZone ( "US / Central"))); DateTimeFormatter 파서 1 = DateTimeFormat.forPattern ( "yyyy-MM-dd HH : mm : ss, SSS");
아 미트

캘린더 객체에서 시간대를 설정해도 작동하지 않지만 날짜 포맷터 객체에서 시간대를 설정 했습니까?
Bill

DateTime 및 DateTimeFormatter 란 무엇입니까?
SweetWisher ツ

11

내 솔루션

public class CalendarUtils {

    public static String dateFormat = "dd-MM-yyyy hh:mm";
    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);

    public static String ConvertMilliSecondsToFormattedDate(String milliSeconds){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(Long.parseLong(milliSeconds));
        return simpleDateFormat.format(calendar.getTime());
    }
}

6

나는 이렇게한다 :

static String formatDate(long dateInMillis) {
    Date date = new Date(dateInMillis);
    return DateFormat.getDateInstance().format(date);
}

getDateInstance(int style)다음 매개 변수와 함께 사용할 수도 있습니다 .

DateFormat.SHORT

DateFormat.MEDIUM

DateFormat.LONG

DateFormat.FULL

DateFormat.DEFAULT



5

가장 쉬운 방법:

private String millisToDate(long millis){

    return DateFormat.getDateInstance(DateFormat.SHORT).format(millis);
    //You can use DateFormat.LONG instead of SHORT

}

2

아래는 밀리 초에서 날짜 형식으로 날짜를 얻는 솔루션입니다. 이 코드를 실행 하려면 Joda Library 를 사용해야 합니다.

import java.util.GregorianCalendar;
import java.util.TimeZone;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class time {

    public static void main(String args[]){

        String str = "1431601084000";
        long geTime= Long.parseLong(str);
        GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
        calendar.setTimeInMillis(geTime);
        DateTime jodaTime = new DateTime(geTime, 
               DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
        DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd");
        System.out.println("Get Time : "+parser1.print(jodaTime));

   }
}

1

java.time api를 시도해 볼 수 있습니다.

        Instant date = Instant.ofEpochMilli(1549362600000l);
        LocalDateTime utc = LocalDateTime.ofInstant(date, ZoneOffset.UTC);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.