C# 和 Java 将 DateTime 转换为字节数组时的区别
Difference between C# and Java when converting DateTime to byte array
我有一个 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
我不确定如何让这些匹配。根据 ResultSet 的 getBytes(int columnIndex)
方法的 Java 文档,"the bytes represent the raw values returned from the driver"。所以看起来,与标准 C# 协议不同,它不使用 ticks 值来生成字节。当试图将字节数组转换回 DateTime 时,这一点变得很明显。将 -71 -3 65 70 116 -74 -28 64
转换为长整数会得到 4676062923628608953
。但该值超过了 DateTime 的最大刻度值,因此无法将其转换为有效的 DateTime。
那么 Java 是如何得到这些特定字节值的呢?
我需要一种在 C# 中将 DateTime 转换为 byte[ ] 的方法,该方法始终具有与 Java 的 getBytes(int columnIndex)
方法相同的行为。 我无法修改 Java 代码。 C# 输出必须与 Java 输出匹配。这可能吗?
getBytes()
没有为非二进制数据定义,例如它可能 return 特定于驱动程序的数据。
The bytes represent the raw values returned by the driver.
您正在使用的特定数据库/JDBC 驱动程序似乎正在将值作为 double
发送。
-71 -3 65 70 116 -74 -28 64
实际上是十六进制的b9 fd 41 46 74 b6 e4 40
,也就是double
值42419.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# 中进行转换,请参阅 here。
我有一个 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
我不确定如何让这些匹配。根据 ResultSet 的 getBytes(int columnIndex)
方法的 Java 文档,"the bytes represent the raw values returned from the driver"。所以看起来,与标准 C# 协议不同,它不使用 ticks 值来生成字节。当试图将字节数组转换回 DateTime 时,这一点变得很明显。将 -71 -3 65 70 116 -74 -28 64
转换为长整数会得到 4676062923628608953
。但该值超过了 DateTime 的最大刻度值,因此无法将其转换为有效的 DateTime。
那么 Java 是如何得到这些特定字节值的呢?
我需要一种在 C# 中将 DateTime 转换为 byte[ ] 的方法,该方法始终具有与 Java 的 getBytes(int columnIndex)
方法相同的行为。 我无法修改 Java 代码。 C# 输出必须与 Java 输出匹配。这可能吗?
getBytes()
没有为非二进制数据定义,例如它可能 return 特定于驱动程序的数据。
The bytes represent the raw values returned by the driver.
您正在使用的特定数据库/JDBC 驱动程序似乎正在将值作为 double
发送。
-71 -3 65 70 116 -74 -28 64
实际上是十六进制的b9 fd 41 46 74 b6 e4 40
,也就是double
值42419.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# 中进行转换,请参阅 here。