将 Long 转换为 DateTime 从 C# 日期到 Java 日期

2024-05-19

我一直尝试用Java读取二进制文件,而二进制文件是用C#编写的。其中一些数据包含日期时间数据。

当 DateTime 数据写入文件(以二进制形式)时,它使用DateTime.ToBinary(); on C#.

为了读取 DateTime 数据,它将首先从字节转换为长数据,使用BitConverter.ToInt64(byte[], 0),然后使用再次将其从 long 转换为 DateTime 数据DateTime.FromBinary(long)。 (所有这些都是用 C# 编写的)。

假设从字节转换后的长数据是 =-8586803256090942249,转换为DateTime时,会返回 =2018 年 3 月 17 日 5:07:56 下午

现在,我尝试用 Java 读取该二进制文件。为了将字节数据转换为长数据,我使用以下代码:ByteBuffer.wrap(byte[]).order(ByteOrder.LITTLE_ENDIAN).getLong().

它将像 C# 一样返回精确的长数据值。但是当我尝试将其从长数据转换为 Java 中的 DateTime 时,使用Date date = new Date(long),它将返回 =5 月 6 日星期日 19:04:17 WIB 272097407反而。

你能帮我解决这个问题的正确解决方案是什么吗?有没有等价的DateTime.FromBinary()从 Java 中的 C# ?或者我的代码错误?非常感谢您的所有回答。


In Java:

    long fromBytes = -8586803256090942249L;

    // Mask out kind and ticks
    int kind = Math.toIntExact((fromBytes >> 62) & 0x3);
    long ticks = fromBytes & 0x3FFF_FFFF_FFFF_FFFFL;
    LocalDateTime cSharpEpoch = LocalDate.of(1, Month.JANUARY, 1).atStartOfDay();
    // 100 nanosecond units or 10^-7 seconds
    final int unitsPerSecond = 10_000_000;
    long seconds = ticks / unitsPerSecond;
    long nanos = (ticks % unitsPerSecond) * 100;
    LocalDateTime ldt = cSharpEpoch.plusSeconds(seconds).plusNanos(nanos);

    switch (kind) {
    case 0: // Unspecified
    case 2: // Local time
        System.out.println("Result LocalDateTime: " + ldt);
        break;

    case 1: // UTC
        OffsetDateTime utcDateTime = ldt.atOffset(ZoneOffset.UTC);
        System.out.println("Result OffsetDateTime in UTC: " + utcDateTime);
        break;

    default:
        System.out.println("Not a valid DateTimeKind: " + kind);
        break;
    }

Output:

结果本地日期时间:2018-03-17T10:07:56.383355900

编辑:号码是

一个 64 位有符号整数,以 2 位编码 Kind 属性 字段和 62 位字段中的 Ticks 属性。

Tetsuya Yamamoto 是正确的,因为ticks 属性表示自 0001/01/01 一天开始(午夜)以来经过的 100 纳秒间隔数。类型为 0(表示未指定)、1(表示 UTC)或 2(表示本地时间)。所以我分别屏蔽了种类和蜱虫。

尽管在你的例子中,种类是 2,这应该是本地时间,但看起来时间确实是 UTC 时间。这是打印的时间与您预计的印度尼西亚西部时间下午 5:07:56 一致的唯一方法。也许该数字是在时区设置为 UTC 的计算机上生成的。

要获取您所在时区的时间:

    ZoneId targetZone = ZoneId.of("Asia/Jakarta");
    ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC).withZoneSameInstant(targetZone);
    System.out.println("Converted to target time zone: " + zdt);

转换为目标时区:2018-03-17T17:07:56.383355900+07:00[亚洲/雅加达]

这与您在 C# 方面所说的一致。

PS 避免Date如果可以的话,请使用 Java 中的类,它早已过时且设计不佳,多年前已被替换java.time,现代 Java 日期和时间 API https://docs.oracle.com/javase/tutorial/datetime/(我当然在上面使用了它)。如果您确实需要Date对于您现在无法更改或不想更改的旧版 API,正如您在评论中已经指出的那样,转换如下:

    Instant inst = ldt.atOffset(ZoneOffset.UTC).toInstant();
    Date date = Date.from(inst);
    System.out.println(date);

默认时区亚洲/雅加达的 JVM 上的输出:

3 月 17 日星期六 17:07:56 WIB 2018

致谢:Andreas 在一个答案(下面的链接)中解释了 64 位数字的结构,并给出了文档的链接。我把它们从那里带走了。

Links

  • DateTime.FromBinary(Int64) 方法 https://learn.microsoft.com/en-us/dotnet/api/system.datetime.frombinary?view=net-5.0来自 .NET 文档
  • 安德烈亚斯对重复问题的回答 https://stackoverflow.com/a/65316086/5772882
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Long 转换为 DateTime 从 C# 日期到 Java 日期 的相关文章

随机推荐

  • 源代码管理无法启动手动合并工具,为什么?

    我曾经执行过tf 合并 Alpha Dev Alpha Main recursive从命令提示符将更改从 Dev 分支合并到 Main 分支 在发生冲突时 它会显示 解决冲突 窗口 我们可以通过选择选项手动解决冲突在合并工具中合并更改 直到
  • 如何在 Eclipse 下载站点上查找哪些功能包含所需的插件

    在针对目标平台开发 RCP 应用程序时 我 和别的 https stackoverflow com questions 10001143 eclipse rcp target platform bundle org eclipse ui v
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 我可以将更大的字体文本添加到 https://portal.azure.com 仪表板上的 Markdown 小部件吗?

    In https portal azure com https portal azure com我想制作一个带有大标签的仪表板 我们的想法是 我们可以在大电视上获取统计数据 这样我们就可以一目了然地看到我们的服务状态 大厂牌会成功的更容易消
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • 在 Matlab 中保存 Kinect 深度图像?

    通过使用 Kinect 我可以获得深度图像 其中每个深度图像像素存储相机和物体之间的距离 以毫米为单位 现在我想保存它们以便以后使用 最好的推荐是什么 我正在考虑将深度图像保存为图像 jpg png等 然而 该值通常是从50毫米到10000
  • SQL服务器超时

    我的应用程序是在经典 asp 上开发的 但也使用 asp net 因为我正在将应用程序迁移到 Net 上 它使用 SQL Server 作为数据库并托管在 Windows Server 2003 上 现在的问题是应用程序在很长一段时间内继续
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • PHP 共享标头而不使用服务器端脚本?

    到目前为止我总是通过 PHP 解决简单的问题 您有一个包含页眉 菜单 页脚和内容字段的网站 每个页面的页眉 菜单和页脚通常是相同的 在没有 PHP 或任何其他服务器端语言的情况下 如何使页眉 菜单和页脚数据仅存在于一个文件中 例如 您不会有
  • 将带有地理位置数据的照片保存到照片库 Swift 3

    如何使用地理位置元数据将照片保存到照片库 我已请求 并允许 应用程序访问用户位置 private func allowAccessToUserLocation locationManager CLLocationManager locati
  • EC2专用实例是否共享RAM带宽?

    如果我创建一个专用实例并且它在多芯片服务器上启动 它是否共享其自己的 CPU 的 RAM 带宽 如果邻居运行一些消耗内存带宽的任务会发生什么 它会影响我的实例吗 这在共享实例上怎么样 RAM有哪几种寻址方式 仅在其自己的 numa 节点上还
  • 如何手动发送django异常日志?

    我的应用程序中有一个应该返回的特定视图HttpResponse 如果一切都成功完成并且类似HttpResponseBadRequest 否则 此视图适用于外部数据 因此可能会引发一些意外的异常 我当然需要知道发生了什么 所以我有这样的东西
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • 要在子集中显示的非数字条目的维恩图

    我有以下数据框 SET1 SET2 SET3 par1 par2 par1 par2 par3 par2 par3 par4 par5 我想制作一个维恩图 其中所有这些 parX 元素都显示在各自的子集中 即作为标签 而不仅仅是重叠元素的数
  • CSS - div 与父 div 底部对齐(内联块)

    我知道这个 html 很草率 有一些不必要的额外 div 但无论如何 我无法理解为什么 ID 为 info box right 的 div 与父 div 的底部对齐 您可以看到 文本 与下面的 jsfiddle 示例的底部 有什么想法可以让
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首