前几天,因为工作原因,连到了公司的一个java系统。查看数据的时候,突然整个人都不好了,数据库中日期字段时间为毛都是整型?之前从来没有接触过java,所心就趁机了解了一下。原来,在数据库中,保存的是java中的System.currentTimeMillis()。这个返回是从1970年1月1日0时0分0秒起到现在的毫秒数,并且这是个UTC时间。明白了为什么是整型的,而我是用的.net mvc,要想正确显示出时间,还需要做一定的转换,然后就想到了一种最简单的方法,写一个通用的方法,把这个整型转换成.net的DateTime.
从网上扒了一个方法:http://blog.csdn.net/dragonpeng2008/article/details/8681435
public static DateTime? ConvertJavaDateTimeToNetTime(long time_JAVA_Long)//java长整型日期,毫秒为单位 { DateTime dt_1970 = new DateTime(1970, 1, 1, 0, 0, 0); long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度 long time_tricks = tricks_1970 + time_JAVA_Long * 10000;//日志日期刻度 DateTime dt = new DateTime(time_tricks).AddHours(8);//转化为DateTime return dt; }
然后自己封装一下,可直接用。
以后碰到java的long time,直接使用DateTime dt=ConvertJavaDateTimeToNetTime(1207969641193);这样使用即可。
问题解决了。
但是,如果经常碰到这样的问题,我每次都要调用这个方法,是不是很low?
想想,即然java有很多系统中,时间都是用这这种方式保存的,我们可不可以,自定义一种类型。专门在.net系统中,作为java的long time类型?
即然到这里了,就得想一个更好的方法:结构体+运算符重载
并于结构体和运算符重载,网上有很多基础的介绍,但是一般的项目中确很少用得到,基本上平时都是用类代替了(其实这种是错误的,但是平时也没有太在意)。
我们就来试一试:
public struct JavaLongDateTime { /// <summary> /// java中的currentTimeMillis /// </summary> public long JavaTimeMillis { get; set; } /// <summary> /// 转换成.net DateTime后的日期对像 /// </summary> public DateTime Value { get { return ConvertToDateTime(); } } public JavaLongDateTime(long javaMillis) { JavaTimeMillis = javaMillis; } #region 两个JavaLongDateTime 相加减 public static JavaLongDateTime operator +(JavaLongDateTime o1, JavaLongDateTime o2) { JavaLongDateTime r = new testConsole.JavaLongDateTime(); r.JavaTimeMillis = o1.JavaTimeMillis + o2.JavaTimeMillis; return r; } public static JavaLongDateTime operator -(JavaLongDateTime o1, JavaLongDateTime o2) { JavaLongDateTime r = new testConsole.JavaLongDateTime(); r.JavaTimeMillis = o1.JavaTimeMillis - o2.JavaTimeMillis; return r; } #endregion #region JavaLongDateTime与整数 相加减 public static JavaLongDateTime operator +(JavaLongDateTime o1, long _javaMillis) { JavaLongDateTime r = new testConsole.JavaLongDateTime(); r.JavaTimeMillis = o1.JavaTimeMillis + _javaMillis; return r; } public static JavaLongDateTime operator -(JavaLongDateTime o1, long _javaMillis) { JavaLongDateTime r = new testConsole.JavaLongDateTime(); r.JavaTimeMillis = o1.JavaTimeMillis - _javaMillis; return r; } #endregion // 隐式转换 //long f = o1; public static implicit operator long(JavaLongDateTime o1) { return o1.Value.Ticks; } // 显式转换 //JavaLongDateTime javaDateTime = (JavaLongDateTime)javaMillis; public static explicit operator JavaLongDateTime(long javaMillis) { return new JavaLongDateTime(javaMillis); } private DateTime ConvertToDateTime() { DateTime dt_1970 = new DateTime(1970, 1, 1, 0, 0, 0); long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度 long time_tricks = tricks_1970 + JavaTimeMillis * 10000;//日志日期刻度 DateTime dt = new DateTime(time_tricks).AddHours(8);//转化为DateTime return dt; } public override string ToString() { return this.Value.ToString(); } }
完成上面的代码,我们再写一个测试方法:
public class Program { public static void Main(string[] args) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); long javaTimeMillis_1 = 1420335269000; JavaLongDateTime javaDateTime = new JavaLongDateTime(javaTimeMillis_1); Console.WriteLine("Java中System.currentTimeMillis:" + javaTimeMillis_1); Console.WriteLine("==>转换成.net DateTime:" + javaDateTime.Value.ToString()); Console.WriteLine("直接输出:" + javaDateTime.ToString()); Console.WriteLine("*****************************************"); Console.WriteLine("测试显示式转换和隐式转换"); long javaTimeMillis_2 = 1420335269000; JavaLongDateTime javaDateTime1 = (JavaLongDateTime)javaTimeMillis_2;//测试显式转换,直接从Long转换成我们自定义的JavaLongDateTime Console.WriteLine("Java中System.currentTimeMillis:" + javaTimeMillis_2); Console.WriteLine("==>转换成.net DateTime:" + javaDateTime1.Value.ToString()); long tick = javaDateTime1;//测试隐式转换,将自定义的JavaLongDateTime 转换成为.net的Ticks Console.WriteLine("转换成.net DateTime Ticks:" + tick); Console.ReadLine(); } }
运行测试一下:
成功!
上面代码没有加上 异常捕获。