У меня есть Java-программа, которая считывает каждое значение из базы данных и преобразует ее в массив байтов. В настоящее время я пытаюсь написать эквивалентную программу на C#. Однако у меня возникают трудности с DateTimes. Код Java и код C# создают разные значения байтов.Разница между C# и Java при преобразовании DateTime в массив байтов
Вот код 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] + " ");
}
}
}
Выход для DateTime 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) + " ");
}
}
}
Выход для DateTime 19.02.2012 3:12:21 PM:
-128 -72 98 16 63 57 -45 8
Я не уверен, как получить их, чтобы соответствовать. Согласно документации Java для метода ResultSet getBytes(int columnIndex)
, «байты представляют собой необработанные значения, возвращаемые драйвером». Таким образом, кажется, что, в отличие от стандартного протокола C#, он НЕ использует значение ticks для создания байтов. Это становится очевидным при попытке перевести массив байтов обратно в DateTime. Преобразование -71 -3 65 70 116 -74 -28 64
в длинный дает вам 4676062923628608953
. Но это значение превышает максимальное значение tick для DateTime, поэтому оно не может быть преобразовано в действительное значение DateTime.
Итак, как же Java заканчивается этими конкретными байтовыми значениями?
Мне нужен способ преобразования DateTime в байт [] в C#, который будет ВСЕГДА иметь то же поведение, что и метод getBytes(int columnIndex)
Java. Я не могу изменить код Java. Вывод C# должен соответствовать выходу Java. Это возможно?
Можете ли вы поделиться кодом Java, который хранит даты в базе данных? (Или это код C#, в котором хранятся даты в базе данных?) – adv12
Малодушная и большая суета? – bcsb1001
Java использует миллисекунды с 1 января 1970 года.C# использует «Ticks» - одну десятую миллионную долю секунды и рассчитывает их с 1 января 0001 года. –