将Java Instant转换为.Net DateTime.Ticks

时间:2018-02-28 01:22:25

标签: java datetime

我需要将Instant转换为.Net的DateTime.Ticks,即一个长度,表示自0001年1月1日0:00:00 UTC以来的100纳秒数。

不幸的是,没有ChronoUnit.HUNDRED_NANOS这样的东西,所以似乎必须推出自己的代码。

2 个答案:

答案 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);
}