如何将.net datetime.tobinary()转换为java日期

ijxebb2r  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(410)

这个问题在这里已经有了答案

将long to datetime从c#date转换为java date(1个答案)
24天前关门。
在json响应中,我有一个.net int64值(来自datetime.tobinary())为-858601858923421115。如何将该值转换为有效的java日期?
谢谢,桑德普

2fjabf4q

2fjabf4q1#

最好转换为unix time.net datetimeoffset.tounixtimemillizes,然后使用java.util.date java构造函数对其进行解析

bihw5rsg

bihw5rsg2#

转换值(例如。 -8586018589234214115 )至 DateTime 对象(例如, theDateTimeObject )使用 DateTime.FromBinary(Int64) 转换 theDateTimeObjectDateTimeOffset 作为 DateTimeOffset dateTime = DateTime.SpecifyKind(theDateTimeObject, DateTimeKind.Utc) 传递的值 DateTimeOffset.ToUnixTimeMilliseconds 进入 java.time.Instant#ofEpochMilli 得到一个物体 Instant 可以转换为其他日期时间类型。
演示:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        long millis = 1608075095347L;
        Instant instant = Instant.ofEpochMilli(millis);
        System.out.println(instant);

        // You can derive other date-time objects from Instant e.g.
        OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC);
        ZonedDateTime zdt = instant.atZone(ZoneOffset.UTC);
        LocalDateTime ldt = odt.toLocalDateTime();
        System.out.println(odt);
        System.out.println(zdt);
        System.out.println(ldt);
    }
}

输出:

2020-12-15T23:31:35.347Z
2020-12-15T23:31:35.347Z
2020-12-15T23:31:35.347Z
2020-12-15T23:31:35.347

注意,api的日期时间 java.util 以及它们的格式化api, SimpleDateFormat 过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。在trail:date-time了解有关现代日期时间api的更多信息。
注意:无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。

cyej8jka

cyej8jka3#

二进制值为:
一个64位有符号整数,用于编码 Kind 属性和 Ticks 62位字段中的属性。
自从 Kind 财产对我们来说是无用的,我们可以用它来掩盖它 value & ((1L << 62) - 1) 为了得到 Ticks 财产。
勾号是:
一个滴答声代表100纳秒或1千万分之一秒。有 10,000 毫秒内的滴答声(参见 TicksPerMillisecond )一秒钟就有1000万个滴答声。
此属性的值表示此后经过的100纳秒间隔数 12:00:00 midnight, January 1, 0001 .
也就是说我们可以这样转换:

private static final long NANOS_PER_TICK = 100L;
private static final long TICKS_PER_SECOND = 1000000000L / NANOS_PER_TICK;
private static final long YEAR_OFFSET = -62135596800L;
// Seconds from Epoch to 12:00:00 midnight, January 1, 0001, calculated using:
//   OffsetDateTime.of(1, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC).toEpochSecond()
static Instant fromDateTimeBinary(long value) {
    long ticks = value & ((1L << 62) - 1);
    return Instant.ofEpochSecond(ticks / TICKS_PER_SECOND + YEAR_OFFSET,
                                 ticks % TICKS_PER_SECOND * NANOS_PER_TICK);
}

测试

long dateTimeBinary = -8586018589234214115L;
System.out.println(dateTimeBinary + " -> " + fromDateTimeBinary(dateTimeBinary));

输出

-8586018589234214115 -> 2020-09-10T14:26:02.056169300Z

警告:系统 -8586018589234214115 值指定 Kind 的价值 2=Local (表示的时间是本地时间),但我们不知道“本地”时区是什么,因此转换为utc的结果可能是错误的。
我们也可以用另一种方式转换:

static long toDateTimeBinary(Instant dateTime) {
    long ticks = (dateTime.getEpochSecond() - YEAR_OFFSET) * TICKS_PER_SECOND
               + dateTime.getNano() / NANOS_PER_TICK;
    return (0x01L/*Kind=UTC*/ << 62) | ticks;
}

测试

Instant now = Instant.now();
System.out.println(now + " -> " + toDateTimeBinary(now));

输出

2020-12-16T01:51:17.066065200Z -> 5249122821198048556

看到了吗also:java 8 时间-相当于.net datetime.maxvalue.ticks

相关问题