2015-11-01 276 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);