程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Java longTime 和C#日期轉換(結構+運算符重載),

Java longTime 和C#日期轉換(結構+運算符重載),

編輯:C#入門知識

Java longTime 和C#日期轉換(結構+運算符重載),


前幾天,因為工作原因,連到了公司的一個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();
        }
    }

 

 

 

 運行測試一下:

 

成功!

 

上面代碼沒有加上 異常捕獲。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved