我需要将Instant
转换为.Net的DateTime.Ticks
,即一个长度,表示自0001年1月1日0:00:00 UTC以来的100纳秒数。
不幸的是,没有ChronoUnit.HUNDRED_NANOS
这样的东西,所以似乎必须推出自己的代码。
答案 0 :(得分:1)
下面的函数toDotNetDateTimeTicks(Instant)
可以解决问题。
static long hundredNanosUntil(Instant begin, Instant end) {
long secsDiff = Math.subtractExact(end.getEpochSecond(), begin.getEpochSecond());
long totalHundredNanos = Math.multiplyExact(secsDiff, 10_000_000);
return Math.addExact(totalHundredNanos, (end.getNano() - begin.getNano()) / 100);
}
static final Instant dotNetEpoch = ZonedDateTime.of(1, 1, 1, 0, 0, 0, 0,
ZoneOffset.UTC).toInstant();
static long toDotNetDateTimeTicks(Instant i) {
return hundredNanosUntil(dotNetEpoch, i);
}
答案 1 :(得分:0)
请记住,1个滴答等于100 ns,这里使用Eugene Beresovsky解决方案的表示法是使用Duration
类以及从.Net滴答转换为Instant的另一种解决方案。
static final Instant dotNetEpoch = ZonedDateTime.of(1, 1, 1, 0, 0, 0, 0,
ZoneOffset.UTC).toInstant();
// Converts Instant to .NET Tick
static long toDotNetDateTimeTicks(Instant i) {
Duration d =Duration.between(dotNetEpoch, i);
long secTix =Math.multiplyExact(d.getSeconds(), 10_000_000) ;
long nanoTix = d.getNano()/ 100 ;
long tix = Math.addExact(secTix,nanoTix);
return tix;
}
// Converts .NET Tick to Instant
static Instant toInstantFromDotNetDateTimeTicks(long dotNetTicks) {
long millis =Math.floorDiv(dotNetTicks,10000) ;
long restTicks = Math.floorMod(dotNetTicks,10000);
long restNanos =restTicks*100;
return dotNetEpoch.plusMillis(millis).plusNanos(restNanos);
}