Java longTime 和C#日期转换(结构+运算符重载)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Java longTime 和C#日期转换(结构+运算符重载)

Java longTime 和C#日期转换(结构+运算符重载)

 2016/10/2 5:33:08  带K的徐大爷  程序员俱乐部  我要评论(0)
  • 摘要:前几天,因为工作原因,连到了公司的一个java系统。查看数据的时候,突然整个人都不好了,数据库中日期字段时间为毛都是整型?之前从来没有接触过java,所心就趁机了解了一下。原来,在数据库中,保存的是java中的System.currentTimeMillis()。这个返回是从1970年1月1日0时0分0秒起到现在的毫秒数,并且这是个UTC时间。明白了为什么是整型的,而我是用的.netmvc,要想正确显示出时间,还需要做一定的转换,然后就想到了一种最简单的方法,写一个通用的方法,把这个整型转换成
  • 标签:C# Java 重载

前几天,因为工作原因,连到了公司的一个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();
        }
    }

 

 

 

 运行测试一下:

 

成功!

 

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

发表评论
用户名: 匿名