我需要一个高精度的时间转换之间的原生Android应用程序和基于.NET的时间戳。
.NET端只使用:
long timeNowTicks = System.DateTime.UtcNow.Ticks;我需要将这个.NET时间戳匹配到Android端的5分钟内(30亿条蜱)。我不能改变.NET的东西。
我试过:
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分钟的精度?
发布于 2015-11-23 17:26:34
是的,我相信GregorianCalendar确实观察到了朱利安/格雷戈里安的截止符--尽管我注意到你把oldUtcTime设定在公元1号的2月1日,这可能是为什么你看到的是20天而不是10天。
要做到这一点,最简单的方法是使用.NET以毫秒为单位找出Unix时代,然后将其作为Java方面的常量使用:
// Handy method in .NET 4.6...
var unixEpoch = DateTimeOffset.FromUnixTimeSeconds(0);
Console.WriteLine(unixEpoch.Ticks / 10000L);这就产生了62135596800000的输出。所以你需要:
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分钟,仅仅是因为时钟漂移随着时间的推移,如果它们不自动纠正…
https://stackoverflow.com/questions/33876839
复制相似问题