Как проанализировать дату Sharepoint из шестнадцатеричного кода в java.util.Date - PullRequest
2 голосов
/ 25 октября 2010

Я пытаюсь проанализировать дату из MS Sharepoint в java.util.Date. Детали: Я запрашиваю Sharepoint из веб-приложения Grails через метод SOAP GetListItems. В списке Sharepoint дата отображается правильно, здесь 09/11/2009, но в ответе SOAP я получаю

0x01ca60cf|0x94894000
Кроме того, это происходит только с типами файлов docx, pptx и т. Д.

Итак, кто-нибудь знает, как преобразовать это в java.util.Date? Я уже пытался преобразовать два шестнадцатеричных значения в Long или в байты и сдвинуть их вокруг, но все алгоритмы, которые я погуглил, работают только для предоставленных примеров шестнадцатеричных значений.

[Редактировать] Например, это SO-решение (преобразованное в Java) не сработало для моих значений.

1 Ответ

4 голосов
/ 25 октября 2010

После небольшого количества проб и ошибок я получил следующее:

def date = "0x01ca60cf|0x94894000"

// Parse our hex numbers into a single number
def nums = Long.parseLong( date.split( /\|/ ).collect { it.replace( '0x', '' ) }.join( '' ), 16 ) / 10000
// MS calendar goes from 1600...  Java's goes from 1970, so we need to make up the difference
nums += Calendar.instance.updated( year:1601, month:0, date:1 ).time.time

println "Converted date is ${new Date( nums as Long )}"

Вы, вероятно, захотите сделать гораздо больше тестов, чтобы убедиться, что это не просто случайность, я получил правильную дату в этом случае ...

У вас есть больше значений для проверки?

EDIT ...

Аааа ... единственное, в чем я не был уверен, это то, зачем мне нужно было / 10000, но документация для тиков в объекте DateTime показывает, что:

Один тик представляет сто наносекунды или одна десятая миллионная часть второй. Есть 10000 тиков в миллисекунды.

Что объясняет это: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...