请高手赐教,关于java date与win32 filetime格式之间的转换

shibai 2009-04-20 11:39:41
FileTIME
时间低位:1907785472
时间高位:30089218

对应Java Date为:2010-7-10 15:35:18


请问如何把2010-7-10 15:35:18转换成
FileTIME
时间低位:1907785472
时间高位:30089218

以及
如何把
FileTIME
时间低位:1907785472
时间高位:30089218
转换成
Java Date为:2010-7-10 15:35:18


谢谢!
...全文
446 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chd_njtu 2010-06-06
  • 打赏
  • 举报
回复
接分。。。。
lijiefengjing 2009-04-20
  • 打赏
  • 举报
回复
见识一下,期待有人回答,自己也学点
jinxfei 2009-04-20
  • 打赏
  • 举报
回复
献丑了,以后还要更细心才行。
jinxfei 2009-04-20
  • 打赏
  • 举报
回复
重大失误,更正:

windows的时间是从1601年开始的100纳秒数,

重新计算如下:


Calendar c1601=Calendar.getInstance();
c1601.set(Calendar.YEAR, 1601);
c1601.set(Calendar.MONTH, Calendar.JANUARY);
c1601.set(Calendar.DAY_OF_MONTH, 1);
c1601.set(Calendar.HOUR, 0);
c1601.set(Calendar.MINUTE, 0);
c1601.set(Calendar.SECOND, 0);
c1601.set(Calendar.MILLISECOND, 0);
long interval=0-c1601.getTimeInMillis();//1601的毫秒数,因为早于1970,因此是个负数,用0减得正数

long time1= 30089218l<<32;
time1+=1907785472l;//高低位合并,得到自1601年以来的"100纳秒"数
time1/=10000;//得到毫秒
Date d=new Date(time1-interval);//interval是1601-1970年之间的毫秒数
System.out.println(d);
  • 打赏
  • 举报
回复
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test4 {

public static void main(String[] args) throws ParseException {

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

Date date1 = sdf.parse("2010-07-10 07:35:18");

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

FileTime file = new FileTime();
file.setHigh(30089218);
file.setLow(1907785472);
Date date2 = FileTime.fileTime2Date(file);
System.out.println(sdf.format(date2));
}
}

class FileTime {

/**
* Unix 时间 1970-01-01 00:00:00 与 Win32 FileTime 时间 1601-01-01 00:00:00
* 毫秒数差
*/
public final static long UNIX_FILETIME_DIFF = 11644473600000L;

/**
* Win32 FileTime 采用 100ns 为单位的,定义 100ns 与 1ms 的倍率
*/
public final static int MILLISECOND_MULTIPLE = 10000;

private int low;
private int high;

public FileTime() {

}

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

/**
* 将 Win32 的 FileTime 结构转为 Java 中的 Date 类型
* @param fileTime
* @return
*/
public static Date fileTime2Date(FileTime fileTime) {
return new Date(fileTime.getFileTime() / FileTime.MILLISECOND_MULTIPLE - FileTime.UNIX_FILETIME_DIFF);
}

/**
* 将 Java 中的 Date 类型转为 Win32 的 FileTime 结构
* @param date
* @return
*/
public static FileTime date2FileTime(Date date) {
long time = (FileTime.UNIX_FILETIME_DIFF + date.getTime()) * FileTime.MILLISECOND_MULTIPLE;
FileTime fileTime = new FileTime();
fileTime.setHigh((int)(time >> 32) & 0xffffffff);
fileTime.setLow((int)time & 0xffffffff);
return fileTime;
}

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

/**
* 获得 FileTime 以 64 位数字表示的数据
* @return
*/
public long getFileTime() {
return ((long)high << 32 & 0xffffffff) | ((long)low & 0xffffffff);
}

public String toString() {
return "high: " + high + ", low: " + low;
}
}
jinxfei 2009-04-20
  • 打赏
  • 举报
回复
说错了,是只用低位。
jinxfei 2009-04-20
  • 打赏
  • 举报
回复
计算精度到秒的话,只用时间高位即可,
windows的timestamp读秒起始日期为1950年,而java的起始日期为1970nian ,
其中相差20年,差距为621355968秒


long time=(1907785472l-621355968l)*1000;
Date d=new Date(time);
System.out.println(d);



Thu Oct 07 13:31:44 CST 2010
xinglongjian 2009-04-20
  • 打赏
  • 举报
回复
学习一下 请教什么叫时间低位 时间高位阿?

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧