/** * ======================================================== * 北京五八信息技术有限公司技术中心开发一部 * 日 期:2011-4-2 下午01:02:55 * 作 者:张纪豪 * 版 本:1.0.0 * ======================================================== * 修订日期 修订人 描述 * */ package org.howsun.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; /** * 功能描述:C#的ticks值与Java的Date对象互相转换 * 如果算出的结果有误,则是时区timeZone不对,可以调用setTimeZone()方法设置时区 * * @author howsun(howsun.zhang@google.com) * @version 1.0.0 */ public class Jdate2CshapeTicks { private static final long TICKS_AT_EPOCH = 621355968000000000L; private static final long TICKS_PER_MILLISECOND = 10000; private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); private static TimeZone timeZone = TimeZone.getDefault(); /** * 将C#的ticks值转换成Java的Date对象 * @param ticks * @return */ public static Date fromDnetTicksToJdate(long ticks){ Calendar calendar = Calendar.getInstance(timeZone); calendar.setTimeInMillis((ticks - TICKS_AT_EPOCH) / TICKS_PER_MILLISECOND); calendar.setTimeInMillis(calendar.getTimeInMillis() - calendar.getTimeZone().getRawOffset()); return calendar.getTime(); } /** * 将日期的字符串值转换成C#的ticks值 * @param time * @return */ public static long getCShapeTicks(String time){ long result = -1; Date date = null; try { date = sdf.parse(time); Calendar calendar = Calendar.getInstance(timeZone); calendar.setTime(date); return (calendar.getTimeInMillis() + calendar.getTimeZone().getRawOffset()) * TICKS_PER_MILLISECOND + TICKS_AT_EPOCH; } catch (Exception e) { } return result; } /** * 将Java日期对象转换成C#的ticks值 * @param jDate * @return */ public static long getCShapeTicks(Date jDate){ long result = -1; try { Calendar calendar = Calendar.getInstance(timeZone); calendar.setTime(jDate); return (calendar.getTimeInMillis() + calendar.getTimeZone().getRawOffset()) * TICKS_PER_MILLISECOND + TICKS_AT_EPOCH; } catch (Exception e) { } return result; } /** * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { String[] cc = { "634264332702330000|2010-11-27 05:41:10.233", "634264332702070000|2010-11-27 05:41:10.207", "634264332701800000|2010-11-27 05:41:10.180", "634264332701530000|2010-11-27 05:41:10.153", "634264332701270000|2010-11-27 05:41:10.127"}; for (int i = 0; i < cc.length; i++) { String[] rr = cc[i].split("\\|"); long ticks = Long.parseLong(rr[0]); long tf = getCShapeTicks(rr[1]); System.out.print(ticks == tf); System.out.print("\t"); System.out.print(sdf.format(fromDnetTicksToJdate(ticks)).equals(rr[1])); System.out.print("\t"); long newTicks = getCShapeTicks(sdf.parse(rr[1])); System.out.println(ticks==newTicks); } } public static void setTimeZone(TimeZone timeZone) { Jdate2CshapeTicks.timeZone = timeZone; } }