2016-04-29 8 views
1

У меня есть 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. Это возможно?

+0

Можете ли вы поделиться кодом Java, который хранит даты в базе данных? (Или это код C#, в котором хранятся даты в базе данных?) – adv12

+1

Малодушная и большая суета? – bcsb1001

+3

Java использует миллисекунды с 1 января 1970 года.C# использует «Ticks» - одну десятую миллионную долю секунды и рассчитывает их с 1 января 0001 года. –

ответ

0

getBytes() не определен для недвоичных данных, например. он может возвращать данные, относящиеся к драйверу.

Байт представляет собой необработанные значения, возвращаемые водителем.

Похоже, что используемый вами драйвер базы данных/JDBC отправляет значение как double.

-71 -3 65 70 116 -74 -28 64 на самом деле b9 fd 41 46 74 b6 e4 40 в гексагоне, что является значением double42419.633576388886 в порядке Маленький-Endian.

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.

См. here как конвертировать в C#.

+0

Вы спасатель. Изменен мой код C# для этого, и он работал как шарм: 'byte [] b = BitConverter.GetBytes (date.ToOADate());' Спасибо за вашу помощь! – jmwilkes