2015-11-01 165 views
2

我有创造的蒙戈数据库的Java VS C#毫秒时间戳代

private static long ukTimeStringToUtcMillis(String s) { 
    SimpleDateFormat sdf = makeSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 
    try { 
     return sdf.parse(s).getTime(); 
    } catch (ParseException e) { 
     throw new RuntimeException(e); 
    } 
} 

private static SimpleDateFormat makeSimpleDateFormat(String s) { 
    SimpleDateFormat sdf = new SimpleDateFormat(s); 
    sdf.setTimeZone(TimeZone.getTimeZone("Europe/London")); 
    return sdf; 
} 

毫秒时间戳和地方它,我创造“2015年10月1日00:00时戳下面的Java代码: 00" 使用简单

long l = ukTimeStringToUtcMillis("2015-10-01T00:00:00.000"); 

这给了我的14436.54亿时间戳【JAVA],使用http://www.epochconverter.com/epoch/timezones.php?epoch=1443654000000&tz=Europe%2FLondon我们可以看到,这给“中时区欧洲/伦敦星期四2015年10月1日00:00:00(上午) (BST)”。现在

,我的问题(或缺乏理解!)是,我有相当的代码在C#中做转换为Unix毫秒为单位

public static class DateTimeHelpers 
{ 
    public static DateTime UnixEpoch() 
    { 
     return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    } 

    public static DateTime FromMillisecondsSinceUnixEpoch(long milliseconds) 
    { 
     return UnixEpoch().AddMilliseconds(milliseconds).ToUniversalTime(); 
    } 

    public static long ToMillisecondsSinceUnixEpoch(DateTime dateTime) 
    { 
     return (long)(dateTime - UnixEpoch()).TotalMilliseconds; 
    } 
} 

,要获得该毫秒“2015年10月1日00:00:00" 我做

DateTime dt = new DateTime(2015, 10, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
long l = DateTimeHelpers.ToMillisecondsSinceUnixEpoch(dt); 

但是这给l = 1443657600000 [C#]其转化http://www.epochconverter.com/epoch/timezones.php?epoch=1443657600000&tz=Europe%2FLondon给 “周四2015年10月1日01:00:00(上午)在时区欧洲/伦敦(BST)” 。

  1. 这是为什么给+01:00?
  2. 我怎样才能获得C#代码产生究竟什么的Java呢?

这是非常重要的,我可以一致地从两种语言查询数据库中的时间戳,但目前C#给我一个小时的差异。

感谢您的时间。


答案:为了得到这个工作,我改变了方法

public static long ToMillisecondsSinceUnixEpoch(DateTime dateTime) 
{ 
    return (long)(dateTime.ToUniversalTime().Subtract(UnixEpoch())).TotalMilliseconds; 
} 

和使用

DateTime dt = new DateTime(2015, 10, 1, 0, 0, 0, 0); 
lonf l = DateTimeHelpers.ToMillisecondsSinceUnixEpoch(dt); 

注缺乏DateTimeKind并在新ToMillisecondsSinceUnixEpoch()方法使用ToUniversalTime()

但是,我并不十分感谢DateTime在我使用ToUniversalTime()之前所做的事情。在创建初始DateTime的使用DateTimeKind.UTC应该这样做?任何关于DateTime在这个(对我来说奇怪的情况下)发生了什么澄清,将不胜感激。

回答

0

我认为,这是行不通的,因为你不使用Java和C#相同的时区。

在您的Java示例中,您在方法makeSimpleDateFormat中应用转换,使用sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"))。所以你输入日期2015/10/01 00:00:00转换为30 Sep 2015 23:00:00 GMT(或大纪元UNIX时间1443654000000)。

但在C#代码,你只是使用UTC日期。这解释了1小时的差异。您必须应用等效转换来检索相同的Epoch Unix时间。下面的代码片段将解决您的代码:

public static long ToMillisecondsSinceUnixEpoch(DateTime dateTime) 
{ 
    DateTimeOffset offset = new DateTimeOffset(dateTime, new TimeSpan(1,0,0)); 
    return (long)(offset - UnixEpoch()).TotalMilliseconds; 
} 

而且随着使用它:

DateTime dt = new DateTime(2015, 10, 1, 0, 0, 0, 0, DateTimeKind.Unspecified); 
long l = DateTimeHelpers.ToMillisecondsSinceUnixEpoch(dt);