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
로 표시 되 기 때문에 자바 의 경우 DWORD
를 int
유형 으로 투사 할 수 있다.이동 연산 자 <<
를 통 해 이 두 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;
}
}
더 읽 기
FILETIME
구조 에 대한 설명 을 더 찾 을 수 있 습 니 다. 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.