前几天,因为工作原因,连到了公司的一个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. VS2010: Microsoft.TeamFoundation.PowerTools.CheckinPolicies.ChangesetComments 未注冊

    VS2010 缺少Team Foundation Server Power Tools 下载地址: http://visualstudiogallery.msdn.microsoft.com/c255 ...

  2. android手机打电话代码分析

    智能手机的打电话功能是由RIL部分来实现的,见下图: 开始分析Android源代码中的RIL部分. 又上图,以及其他相关资料,我得知在Android中有一个叫rild的守护进程.我猜测此进程与电话的拨 ...

  3. jQuery css() 方法

    $("p").css("background-color"); $("p").css("background-color" ...

  4. Linux的内存回收和交换

    Linux的内存回收和交换 版权声明: 本文章内容在非商业使用前提下可无需授权任意转载.发布. 转载.发布请务必注明作者和其微博.微信公众号地址,以便读者询问问题和甄误反馈,共同进步. 微博ID:or ...

  5. 用于迭代器的yield return

    在我们写迭代器的时候往往继承自IEnumerable public class Tuple<T1, T2, T3> : Tuple<T1, T2>,IEnumerable { ...

  6. 谈C#中的Delegate

    引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delegate这个特性,所以一直没有对它作整理.这两天,我再度翻阅了一些关于Delegate的资料 ...

  7. css笔记 css用法:

    前端框架:AdminLTE  https://almsaeedstudio.com/themes/AdminLTE/index2.html CSS学习教程: http://www.divcss5.co ...

  8. 精品教程--IOS零基础开发环境搭建

    下载源码 技术要点: 1. 启动XCODE开始开发 2. IOS项目文件结构分析 3. 添加视图label组件 4. 程序的入口以及启动流程 5. 源码详细的中文注释 ...... 详细介绍: 1. ...

  9. LeetCode34 Search for a Range

    题目: Given a sorted array of integers, find the starting and ending position of a given target value. ...

  10. Dispatcher中Invoke与BeginInvoke

    [同步]Invoke Application.Current.Dispatcher.Invoke(AutoIncreaseNumber); [异步]BeginInvoke Application.Cu ...