Win 32 FILETIME 구조 와 java. util. Date 상호 전환

Win 32 FILETIME 구조 와 java. util. Date 상호 전환
본 고 는 구 글 블 로 거 에서 옮 겨 왔 습 니 다. 원문 은 모두 가 알 고 있 는 이유 로 국내 에 접근 할 수 없 게 되 었 습 니 다. 참고 로 경멸 합 니 다.
이 원본 링크 를 유지 하 십시오:http://www.blogjava.net/frankiegao123/archive/2011/03/26/347087.html
얼마 전 CSDN 에 서 는 Win 32 FileTime 형식 과 자바 중 Date 형식 이 어떻게 서로 바 뀌 는 지 물 었 다.자세 한 내용 은:http://topic.csdn.net/u/20090420/11/8016744d-d151-4041-a837-5a14f2592e3f.html。
MSDN 에서 FILETIME 구조 에 대한 설명 에 따 르 면 FILETIME 와 자바 Date 에서 편리 하 게 상호 전환 할 수 있다.MSDN 에 따 르 면 FILETIME 는 UTC 시간 1601 년 1 월 1 일 0 시 부터 100 나 초 간격 을 나타 내 는 64 비트 수 치 를 사용한다.
MSDN 에서 FILETIME 구조 에 대한 설명 은 다음 과 같다.

typedef struct _FILETIME {
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
DWORD 32 비트 의 부호 없 는 정수 만 표시 할 수 있 기 때문에 두 개 DWORD 를 사용 해 야 file time 을 표시 할 수 있다.dwLowDateTime 는 file time 의 낮은 32 비트 값 을 말 하 는데 dwHighDateTime 는 file time 의 높 은 32 비트 값 을 말한다.
자바 에서 의 시간 은 UTC 시간 인 1970 년 1 월 1 일 0 시 부터 의 밀리초 간격 으로 유 닉 스 기원 을 사용 하 며 자바 에 서 는 long 형식 으로 이 값 을 표시 합 니 다.
위의 지식 이 있 으 면 Win 32 FileTime 시간 과 자바 중 Date 을 쉽게 바 꿀 수 있다.해 야 할 일 은 1601 년 1 월 1 일 0 시 와 1970 년 1 월 1 일 0 시 사이 의 밀리초 차 이 를 계산 해 유 닉 스 기원의 밀리초 수 시간 을 더 해 100 나 초 로 환산 하면 전환 이 가능 하 다 는 것 이다.유 닉 스 기원 에 따 르 면 1970 년 1 월 1 일 0 시 까지 는 모두 마이너스 다.
시간 계산 과 관련 되 기 때문에 정확성 을 확보 하기 위해 먼저 코드 로 시간 대 를 검사 하고 1970 년 1 월 1 일 0 시가 0 인지 확인 합 니 다.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test5 {

    public static void main(String[] args) {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = parseDate("1970-01-01 00:00:00", format);
        System.out.println(date.getTime());
    }

    public static Date parseDate(String str, DateFormat format) {
        Date date = null;
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

위의 코드 가 실 행 된 결 과 는:

-28800000

이 결 과 는 정확 하지 않다 는 것 을 알 수 있다. 현재 우리 시스템 의 시간 대 는 GMT + 8 구역, 즉 그리니치 표준 시간 보다 8 시간 차이 가 나 기 때문에 이 2880000 도 8 시간의 밀리초 이다.우 리 는 DateFormat 에 다음 코드 를 더 하면 포맷 기 를 GMT 시간 으로 바 꿀 수 있다.

public static void main(String[] args) {
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    format.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date date = parseDate("1970-01-01 00:00:00", format);
    System.out.println(date.getTime());
}

이때 우리 가 출력 한 결 과 는 0 이 고 '1601 - 01 - 01 00: 00: 00' 으로 바 꿀 때 출력 은:

-11644473600000

이 값 은 상수 고정 값 이기 때문에 이 값 을 절대 값 으로 잠시 UNIX_FILETIME_MILLISECOND_DIFF 이 라 고 명명 합 니 다.
다음은 밀리초 와 백 나 초의 배율 을 얻어 야 한다.1 초 는 103 밀리초, 1 밀리초 는 106 나 초 로 알려 져 있어 1 밀리초 가 104 백 나 초 로 추산 된다.FILETIME 구 조 는 두 개 DWORD 로 표시 되 기 때문에 자바 의 경우 DWORDint 유형 으로 투사 할 수 있다.이동 연산 자 << 를 통 해 이 두 32 비트 int 를 64 비트 long 의 데이터 로 변환 하여 유 닉 스 기원 밀리초 수 를 계산 할 수 있다.
대상 을 대상 으로 하 는 방식 으로 디자인 하기 위해 FILETIME 구조의 정 의 를 모방 하여 하나의 FILETIME 유형 을 설명 할 수 있 는데 그 중에서 높 은 32 비트 숫자 와 낮은 32 비트 숫자 를 포함한다.패 키 징 을 위해 유 닉 스 기원 과 FILETIME 0 기점 의 밀리초 값 과 밀리초 와 백 나 초의 배율 을 상수 로 설정 합 니 다.

public class FileTime {

    /**
     * Unix    1970-01-01 00:00:00   Win32 FileTime    1601-01-01 00:00:00
     *     
     */
    public final static long UNIX_FILETIME_MILLISECOND_DIFF = 11644473600000L;

    /**
     * Win32 FileTime    100ns     ,   100ns   1ms    
     */
    public final static int MILLISECOND_100NANOSECOND_MULTIPLE = 10000;

    /**
     * FileTime    32   
     */
    private int low;

    /**
     * FileTime    32   
     */
    private int high;

    public FileTime() {

    }

    /**
     *    FileTime   64         
     * @return
     */
    public long getFileTime() {
        return (((long)high << 32) & 0xffffffff) | ((long)low & 0xffffffff);
    }

    public FileTime(int low, int high) {
        this.low = low;
        this.high = high;
    }

    public int getLow() {
        return low;
    }

    public void setLow(int low) {
        this.low = low;
    }

    public int getHigh() {
        return high;
    }

    public void setHigh(int high) {
        this.high = high;
    }

    public String toString() {
        return "high: " + high + ", low: " + low;
    }
}

구 조 를 정 의 했 습 니 다. java.util.Date 와 서로 전환 하기 위해 서 는 하나의 toDate 방법 과 하나의 date2FileTime 정적 방법 이 필요 합 니 다.

/**
 *   Win32   FileTime      Java    Date   
 * @param fileTime
 * @return
 */
public Date toDate() {
    return new Date(getFileTime() / MILLISECOND_100NANOSECOND_MULTIPLE - 
            UNIX_FILETIME_MILLISECOND_DIFF);
}

/**
 *   Java    Date      Win32   FileTime   
 * @param date
 * @return
 */
public static FileTime date2FileTime(Date date) {
    long time = (UNIX_FILETIME_MILLISECOND_DIFF + date.getTime()) * 
            MILLISECOND_100NANOSECOND_MULTIPLE;
    FileTime fileTime = new FileTime();
    fileTime.setHigh((int)(time >> 32) & 0xffffffff);
    fileTime.setLow((int)time & 0xffffffff);
    return fileTime;
}

구조 와 코드 정의 가 완료 되 었 습 니 다. 테스트 코드 를 써 서 테스트 해 보 세 요. "2010 - 07 - 10 15: 35: 18" 의 FileTime 값 이 얼마 인지 보 세 요.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test5 {

    public static void main(String[] args) {

        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date date1 = parseDate("2010-07-10 15:35:18", format);

        FileTime fileTime = FileTime.date2FileTime(date1);
        System.out.println(fileTime.toString());

        FileTime fileTile = new FileTime();
        fileTile.setHigh(30089218);
        fileTile.setLow(1907785472);
        Date date2 = fileTile.toDate();
        System.out.println(format.format(date2));
    }

    public static Date parseDate(String str, DateFormat format) {
        Date date = null;
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

더 읽 기
  • 중국어 위 키 피 디 아 에서 세 계 를 조율 할 때 (UTC) 와 그리니치 표준시 (GMT) 관련 자 료 를 찾 을 수 있 고, 다른 자원 에서 도 관련 자 료 를 검색 할 수 있다.
  • MSDN 에서 FILETIME 구조 에 대한 설명 을 더 찾 을 수 있 습 니 다.
  • 형식 매개 변수 에 대한 정 보 는 이러한 API 문 서 를 참조 할 수 있 습 니 다.
  • 이 클래스 에 대해 잘 모 르 면 이 클래스 의 API 문 서 를 참조 할 수 있 습 니 다.
  • 좋은 웹페이지 즐겨찾기