你的位置:首页 > ASP.net教程

[ASP.net教程]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();    }  }

 

 

 

 运行测试一下:

 

成功!

 

上面代码没有加上 异常捕获。