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

서버에서 생성 된 특정 로그 파일에 밀리 초가 있으며 로그 파일이 생성 된 로케일을 알고 있습니다. 제 문제는 밀리 초를 지정된 형식의 날짜로 변환하는 것입니다. 해당 로그 처리는 다른 시간대에있는 서버에서 발생합니다. “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



답변

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


답변

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


답변

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, 그리고 .


답변

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

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


답변

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


답변

내 솔루션

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


답변

나는 이렇게한다 :

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