将DateTime转换为字节数组时C#和Java之间的区别

杰姆威尔克斯

我有一个Java程序,该程序从数据库中读取每个值并将其转换为字节数组。我目前正在尝试使用C#编写等效程序。但是,我在使用DateTimes时遇到了困难。Java代码和C#代码产生不同的字节值。

这是Java代码:

ResultSet rs = stmt.executeQuery("select * from " + query);
while (rs.next())
{
    for (int j = 1; j <= rs.getMetaData().getColumnCount(); j++)
    {
        byte[] b = rs.getBytes(j);
        if (!rs.wasNull() && b != null)
        {
            for(int i = 0; i < b.length; i++)
                System.out.print(b[i] + " ");
        }
    }
}

日期时间的输出2/19/2016 3:12:21 PM

-71 -3 65 70 116 -74 -28 64

这是C#代码:

OleDbCommand cmd = new OleDbCommand("select * from " + name, conn);
OleDbDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
    for (int i = 0; i < rdr.FieldCount; i++)
    {
        if (rdr[i] != DBNull.Value && rdr[i] is DateTime)
        {
            DateTime date = (DateTime)rdr[i];
            byte[] b = BitConverter.GetBytes((long)date.Ticks);
            foreach (byte bt in b)
                Console.Write(unchecked((sbyte) bt) + " ");
        }
    }
}

日期时间的输出2/19/2016 3:12:21 PM

-128 -72 98 16 63 57 -45 8

我不确定如何使它们匹配。根据ResultSetgetBytes(int columnIndex)方法的Java文档,“字节表示从驱动程序返回的原始值”。因此,似乎与标准C#协议不同,它不使用ticks值来生成字节。当尝试将字节数组转换回DateTime时,这一点变得很明显。转换-71 -3 65 70 116 -74 -28 64成长号会给你4676062923628608953但是该值超过了DateTime的最大刻度值,因此无法将其转换为有效的DateTime。

那么Java如何以那些特定的字节值结束呢?

我需要一种将DateTime转换为C#中的byte []的方法,该方法将始终具有与JavagetBytes(int columnIndex)方法相同的行为我无法修改Java代码。C#输出必须与Java输出匹配。这可能吗?

安德烈亚斯(Andreas)

getBytes() 未为非二进制数据定义,例如它可能返回特定于驱动程序的数据。

字节代表驱动程序返回原始值。

似乎您正在使用的特定数据库/ JDBC驱动程序正在将值发送为double

-71 -3 65 70 116 -74 -28 64实际上b9 fd 41 46 74 b6 e4 40是十六进制的,这是以Little-Endian顺序double42419.633576388886

byte[] b = { -71, -3, 65, 70, 116, -74, -28, 64 };
System.out.println(ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getDouble());
42419.633576388886

如果将其粘贴到Excel中并设置为m/d/yyyy h:mm:ss AM/PM,则得到2/19/2016 3:12:21 PM

有关如何在C#中进行转换的信息,请参见此处

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章