首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓(Java)和.NET DateTime之间的高精度时间同步?

安卓(Java)和.NET DateTime之间的高精度时间同步?
EN

Stack Overflow用户
提问于 2015-11-23 17:19:46
回答 1查看 90关注 0票数 1

我需要一个高精度的时间转换之间的原生Android应用程序和基于.NET的时间戳。

.NET端只使用:

代码语言:javascript
复制
long timeNowTicks = System.DateTime.UtcNow.Ticks;

我需要将这个.NET时间戳匹配到Android端的5分钟内(30亿条蜱)。我不能改变.NET的东西。

我试过:

代码语言:javascript
复制
GregorianCalendar oldUtcTime = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
GregorianCalendar nowUtcTime = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
oldUtcTime.set(1,1,1,0,0,0); // .NET epoch
long utcTicks = 10000 * (nowUtcTime.getTimeInMillis() - oldUtcTime.getTimeInMillis()); // 10,000 ticks per ms

但这一直给我的数字大约是250万秒(~20天)落后于DateTime.UtcNow.Ticks。

Some people说,这是因为,尽管DateTime声称遵守公历,但他们实际上并没有跳过教皇在1500年增加到日历上的10天,但我没有发现两者之间的套路转换。

如何在本地Android时间和.NET DateTime之间获得5分钟的精度?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-23 17:26:34

是的,我相信GregorianCalendar确实观察到了朱利安/格雷戈里安的截止符--尽管我注意到你把oldUtcTime设定在公元1号的2月1日,这可能是为什么你看到的是20天而不是10天。

要做到这一点,最简单的方法是使用.NET以毫秒为单位找出Unix时代,然后将其作为Java方面的常量使用:

代码语言:javascript
复制
// Handy method in .NET 4.6...
var unixEpoch = DateTimeOffset.FromUnixTimeSeconds(0);
Console.WriteLine(unixEpoch.Ticks / 10000L);

这就产生了62135596800000的输出。所以你需要:

代码语言:javascript
复制
private static final long BCL_MILLISECONDS_AT_UNIX_EPOCH = 62135596800000L;
private static final long TICKS_PER_MILLISECOND = 10000L;
...

long bclMillis = System.currentTimeMillis() + BCL_MILLISECONDS_AT_UNIX_EPOCH;
long bclTicks = TICKS_PER_MILLISECOND * bclMillis;

请注意,这并不是真正的“高精度”--它只会和两边的系统时钟一样精确。为了获得真正准确的时间,您需要使用NTP或类似的东西。你仍然可以发现,这两个时钟出了超过5分钟,仅仅是因为时钟漂移随着时间的推移,如果它们不自动纠正…

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33876839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档