前几天,因为工作原因,连到了公司的一个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(, , , , , );
  long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度
  long time_tricks = tricks_1970 + time_JAVA_Long * ;//日志日期刻度
  DateTime dt = new DateTime(time_tricks).AddHours();//转化为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(, , , , , );
long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度
long time_tricks = tricks_1970 + JavaTimeMillis * ;//日志日期刻度
DateTime dt = new DateTime(time_tricks).AddHours();//转化为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 = ;
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 = ;
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();
}
}

运行测试一下:

成功!

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

Java longTime 和C#日期转换(结构+运算符重载)的更多相关文章

  1. Java longTime 和C#日期转换

    封装一下,可直接用. 以后碰到java的long time,直接使用DateTime dt=ConvertJavaDateTimeToNetTime(1207969641193);这样使用即可. 这串 ...

  2. Java Date,long,String 日期转换

    1.java.util.Date类型转换成long类型java.util.Date dt = new Date();System.out.println(dt.toString()); //java. ...

  3. 时间日期转换工具类,获取当前时间YYYYMMDD24HHMISS、YYYYMMDDHHMISS

    YYYYMMDD24HHMISS:24小时制时间(显示上只是比YYYYMMDDHHMISS中间多了一个24),例:2018102224112440 YYYYMMDDHHMISS:12小时制时间,例20 ...

  4. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  5. JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算

    JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 Android老鸟重新学一遍JAVA是什么感觉?枯燥啊,乏味啊,而且归纳写博客,都 ...

  6. java中的日期转换

    在java中有两种Date对象,一种是java.sql.Date,另一种是java.util.Date 一.java.sql.Date对象: 这种Date对象使用了进行数据库操作的,它对应了数据库中的 ...

  7. 日期转换工具类 CommUtil.java

    package com.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.ut ...

  8. 日期转换类 DateConverter.java

    package com.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.D ...

  9. java日期转换

    在java开发过程中,时间的转换时必须掌握的=========下面把时间转换做个总结,有可能不是很全面 时间格式只有两种 yyyy-MM-DD yyyy/MM/DD 时间的类型:字符串类型.sql类型 ...

随机推荐

  1. java建立二叉树,递归/非递归先序遍历,递归/非递归中序遍历,层次遍历

    import java.util.LinkedList; import java.util.Scanner; import java.util.Stack; //structure of binary ...

  2. Approaching the Fun Factor in Game Design

    I recently did some research on this and talked to Dr. Clayton Lewis (computer Scientist in Residenc ...

  3. 用iDSDT制作声显卡DSDT

    已有 2299 次阅读2011-10-24 21:00 |个人分类:Mac| DSDT 快速增加积分秘笈! windows下!--------------------------------第一步.下 ...

  4. 代码片段 - JavaScript 字符串模板

    /* ------------------------------ // 字符串模板1,语法严格,不能混用,效率相对较高 // 使用 {{ }} 作为标记是为了允许在模板中使用 JSON 字符串 // ...

  5. 常见hash算法的原理

    散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫 ...

  6. 讲讲你不知道的 ARC (一)

    来源:伯乐在线 - 酷酷的哀殿 链接:http://ios.jobbole.com/89420/ 点击 → 申请加入伯乐在线专栏作者 内容提要 通过阅读本篇文章,希望您能了解:如何在 ARC 下,强制 ...

  7. 如何使用NSOperations和NSOperationQueues(二)

    "每一个应用程序至少有一个主线程.线程的工作就是去执行一系列的指令.在Cocoa Touch中,主线程包含应用程序的主运行回路.几乎所有你写的代码都会在主线程中执行,除非你特别创建" ...

  8. Android进阶笔记19:onInterceptTouchEvent、onTouchEvent与onTouch

    1.onTouch方法:onTouch方法是View的 OnTouchListener借口中定义的方法,处理View及其子类被touch是的事件处理.当一个View绑定了OnTouchLister后, ...

  9. 《算法导论》习题解答 Chapter 22.1-3(转置图)

    一.邻接表实现 思路:一边遍历,一边倒置边,并添加到新的图中 邻接表实现伪代码: for each u 属于 Vertex for v 属于 Adj[u] Adj1[v].insert(u); 复杂度 ...

  10. 【Amazon Linux】免费搭建subversion服务器

    Amazon的EC2服务器可以免费试用一年.在这里申请: https://aws.amazon.com/cn/free/ 尝试把它弄成一个svn库来保存代码.按照 http://northwaygam ...