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(, , , , , );
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#日期转换(结构+运算符重载)的更多相关文章
- Java longTime 和C#日期转换
封装一下,可直接用. 以后碰到java的long time,直接使用DateTime dt=ConvertJavaDateTimeToNetTime(1207969641193);这样使用即可. 这串 ...
- Java Date,long,String 日期转换
1.java.util.Date类型转换成long类型java.util.Date dt = new Date();System.out.println(dt.toString()); //java. ...
- 时间日期转换工具类,获取当前时间YYYYMMDD24HHMISS、YYYYMMDDHHMISS
YYYYMMDD24HHMISS:24小时制时间(显示上只是比YYYYMMDDHHMISS中间多了一个24),例:2018102224112440 YYYYMMDDHHMISS:12小时制时间,例20 ...
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
[源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...
- JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算
JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 Android老鸟重新学一遍JAVA是什么感觉?枯燥啊,乏味啊,而且归纳写博客,都 ...
- java中的日期转换
在java中有两种Date对象,一种是java.sql.Date,另一种是java.util.Date 一.java.sql.Date对象: 这种Date对象使用了进行数据库操作的,它对应了数据库中的 ...
- 日期转换工具类 CommUtil.java
package com.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.ut ...
- 日期转换类 DateConverter.java
package com.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.D ...
- java日期转换
在java开发过程中,时间的转换时必须掌握的=========下面把时间转换做个总结,有可能不是很全面 时间格式只有两种 yyyy-MM-DD yyyy/MM/DD 时间的类型:字符串类型.sql类型 ...
随机推荐
- C#生成软件注册码
开发软件时,当用到商业用途时,注册码与激活码就显得很重要了.现在的软件破解技术实在在强了,各种国内外大型软件都有注册机制,但同时也不断地被破解.下面发的只是一个常用版本,发出源码被破就更容易了,但我们 ...
- C++ 内存泄露处理方法 (转)
1.可以显示内存泄露情况,但无法找到具体的文件位置写法 包含头文件#include <crtdbg.h> 然后在需要检测内存泄露的位置加上语句 _CrtDumpMemoryLeaks(); ...
- MeetMe
- mysql常用知识点
--存储过程及常用流程控制语法 /*该代码是创建了一个名叫"p4"的存储过程并设置了s1,s2,s3两个int型一个varchar型参数,还可以是其他数据类型,内部创建了x1,x2 ...
- C++面试题:list和vector有什么区别?
原文:http://genwoxuevc.blog.51cto.com/1852984/503337 C++面试题:list和vector有什么区别?考点:理解list和vector的区别出现频率:★ ...
- Win7下安装Apache+PHP+phpMyAdmin+wordpress+drupal+discuz
[Apache] Listen 90 DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs&q ...
- C#面向对象(三)接口实现多态
一.如何用接口实现多态? 1.定义一个接口. using System; using System.Collections.Generic; using System.Linq; using Syst ...
- ios - 带动画圆形旋转的进度条
#import <UIKit/UIKit.h> @interface TJCircleProgressView : UIView /** * 图标 */ @property(nonatom ...
- TCP/IP协议原理与应用笔记21:路由选择的方法
1. 路由选择的方法 (1)基本思想 不是收到IP分组后才能为其选路,而是预先获得所有的目的的路由(Routing Protocol) IP报文按预定的路由转发(route table) (2)预定路 ...
- 【Android Studio使用教程5】使用SDK Manager时, SDK下载更新不了的解决方案(eclipse 也适用)
在线更新sdk时会很慢,甚至下载不了, 此时在SDK Manager中,选择Tools,Proxy里面填上 mirrors.neusoft.edu.cn 和 80 把下面的force https xx ...