我有以下Java代码,它创建一个毫秒时间戳并将其放在Mongo数据库中
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/01 00:00:00”的时间戳long l = ukTimeStringToUtcMillis("2015-10-01T00:00:00.000");
这给了我一个1443654000000 [Java]的时间戳,使用http://www.epochconverter.com/epoch/timezones.php?epoch=1443654000000&tz=Europe%2FLondon我们可以看到这给出了“2015年10月1日星期四00:00:00(am)在欧洲/伦敦(BST)时区” 。
现在,我的问题(或缺乏理解!)是我在C#中有相同的代码来转换为Unix Epoch毫秒
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/01 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(am)在欧洲/伦敦(BST)时区”。
非常重要的是,我可以从两种语言一致地查询数据库中的时间戳,但目前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
方法中缺少ToUniversalTime()
和ToMillisecondsSinceUnixEpoch()
。
但是,在使用DateTime
之前,我并不真正感谢ToUniversalTime()
正在做什么。在创建初始DateTimeKind.UTC
时使用DateTime
应该这样做了吗?任何有关DateTime
在此(对我来说奇怪的情况)发生的事情的澄清将不胜感激。
答案 0 :(得分:0)
我认为,它不起作用,因为你在Java和C#中没有使用相同的时区。
在Java示例中,您将使用makeSimpleDateFormat
的方法在方法sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"))
中应用转换。因此,您输入日期2015/10/01 00:00:00
将转换为30 Sep 2015 23:00:00 GMT
(或Epoch 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);