前幾天,因為工作原因,連到了公司的一個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(); } }
運行測試一下:
成功!
上面代碼沒有加上 異常捕獲。