преобразование c # timestamp в datetime в php - PullRequest
0 голосов
/ 30 октября 2019

У меня есть метка времени из c # (64-битное двоичное значение), которую мне нужно преобразовать в php. Отметка времени создается с помощью метода DateTime.ToBinary (). пример -8586307756854775808, который дает 11/11/2019 22:00:00

Я пытался с unpack () в php, но безуспешно:

$timestamp = unpack('q', -8586307756854775808);

Как я могу это сделатьв php? Спасибо

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Сначала необходимо отделить галочки от 64-битного двоичного значения. Тики 64-битного значения одинаковы при создании DateTime в C # независимо от использования DateTimeKind.Utc или DateTimeKind.Local Затем могут быть преобразованы тики в UNIX-Timestamp. gmdate () возвращает строку даты из отметки времени.

<?php
//num from c# DateTime.ToBinary() 
//2019-10-11 22:00:00
$num = -8586307756854775808;

$ticks = $num & 0x3fffffffffffffff;
$linuxTs = $ticks/10000000 - 62135596800;
$strDate = gmdate("Y-m-d H:i:s",$linuxTs);

echo $strDate; //"2019-10-11 22:00:00"

Примечание. Для этого решения требуется 64-разрядная платформа.

Информация о виде из 64-разрядного значения $ num может такжебыть полезным.

$kind = (ord(pack('J',$num)) & 0xC0)>>6;  //0,1 or 2
0 голосов
/ 30 октября 2019

DateTime.ToBinary создает значение, которое объединяет свойства .Ticks и .Kind в одно 64-битное значение. Вы не должны использовать его, если не намереваетесь передать это значение обратно в DateTime.FromBinary в .NET.

Хотя возможно интерпретировать его за пределами .NET, придетсяприменять ту же логику, что и при реализации DateTime.FromBinary. Вы можете увидеть исходный код здесь .

Вместо этого рассмотрите возможность использования стандартного формата обмена. Наиболее распространенным является ISO 8601 (также частично охвачен RFC 3339 ).

string iso = dateTime.ToString("O");

Выше указано спецификатор "туда-обратно" для получения формата ISO 8601. Есть и другие способы.

Если ваши значения основаны на UTC, вы также можете рассмотреть возможность передачи Unix Timestamp . Самый простой способ получить его из .NET - через DateTimeOffset.ToUnixTimeSeconds или DateTimeOffset.ToUnixTimeMilliseconds в зависимости от того, какую точность вы хотите. Конечно, вам нужно сначала преобразовать DateTime в DateTimeOffset.

long ms = new DateTimeOffset(dateTime).ToUnixTimeMilliseconds();

Выше предполагается, что ваш DateTime имеет DateTimeKind.Local или DateTimeKind.Utc в .Kindсвойство. Если это DateTimeKind.Unspecified, то вам, возможно, придется поработать с TimeZoneInfo, чтобы выровнять по UTC, прежде чем вычислять метку времени Unix.

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