web-dev-qa-db-fra.com

PHP format de date/Date (1365004652303-0500) /

J'appelle une API d'où j'obtiens la date /Date(1365004652303-0500)/. Je ne comprends pas le format. Comment s'appelle ce format de date? Je ne savais pas quoi chercher sur ce type de format.

Quelqu'un peut-il m'aider à obtenir cette date au format Y-m-d H:i:s?

L'API que j'appelle est sur le serveur .NET. Et quand je l'appelle en utilisant file_get_contents et json_decode de PHP, il me donne le format de date suivant pour la date de création: /Date(1365004652303-0500)/

19
Kalpesh

Vous devez d'abord comprendre le format que vous avez 

/Date(1365004652303-0500)/

Alors vous avez

  • horodatage (U) = 1365004652
  • Millisecondes (u) = 303
  • Différence avec l’heure de Greenwich (GMT) (O) = -0500

Construire un format

$date = '/Date(1365004652303-0500)/';
preg_match('/(\d{10})(\d{3})([\+\-]\d{4})/', $date, $matches);
$dt = DateTime::createFromFormat("U.u.O",vsprintf('%2$s.%3$s.%4$s', $matches));
echo $dt->format('r');

Sortie 

Wed, 03 Apr 2013 15:57:32 -0500
                            ^
                            |= Can you see the GMT ? 

interface DateFormatParser
{
    /**
     * @param $string
     *
     * @return DateTime
     */
    public function parse($string);

}

abstract class PregDateParser implements DateFormatParser
{
    protected $pattern, $format, $mask;

    public function parse($string) {
        $string = (string)$string;

        $pattern = $this->pattern;
        $format  = $this->format;
        $mask    = $this->mask;

        $r = preg_match($pattern, $string, $matches);
        if (!$r) {
            throw new UnexpectedValueException('Preg Regex Pattern failed.');
        }
        $buffer = vsprintf($mask, $matches);
        $result = DateTime::createFromFormat($format, $buffer);
        if (!$result) {
            throw new UnexpectedValueException(sprintf('Failed To Create from Format "%s" for "%s".', $format, $buffer));
        }
        return $result;
    }
}

class JsonTimestampWithOffsetParser extends PregDateParser
{
    protected $pattern = '/^\/Date\((\d{10})(\d{3})([+-]\d{4})\)\/$/';
    protected $format  = 'U.u.O';
    protected $mask    = '%2$s.%3$s.%4$s';
}

$date   = '/Date(1365004652303-0500)/';
$parser = new JsonTimestampWithOffsetParser;
$dt     = $parser->parse($date);

echo $dt->format('r');
22
Baba

Essayez ceci:

var_dump(date('Y-m-d H:i:s', '1365004652303'/1000));
$str = '/Date(1365004652303-0500)/';

$match = preg_match('/\/Date\((\d+)([-+])(\d+)\)\//', $str, $date);

$timestamp = $date[1]/1000;
$operator = $date[2];
$hours = $date[3]*36; // Get the seconds

$datetime = new DateTime();

$datetime->setTimestamp($timestamp);
$datetime->modify($operator . $hours . ' seconds');
var_dump($datetime->format('Y-m-d H:i:s'));

Résultats:

string(19) "2013-04-03 17:57:32"
string(19) "2013-04-03 12:57:32"
6
Farkie

Décomposons /Date(1365004652303-0500)/ en:

  • Rendez-vous amoureux
  • 1365004652303
  • -0500

La première chaîne est assez claire.

Le prochain grand nombre est la valeur Epoch

Le -0500 représente le fuseau horaire dans lequel les dates ont été initialement stockées. Il est relatif à UTC et fait donc référence à l'heure normale de l'Est.


MODIFIER

L'époque est avec une précision de mille secondes. Essayez ce code:

<?php
    $str = "/Date(1365004652303-0500)/";
    preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $str, $match );
    echo date( "r", $match[1] );
?>

Vous pouvez également utiliser le fuseau horaire pour définir la date par rapport à la vôtre. http://codepad.viper-7.com/RrSkMy

4
hjpotter92

Cet horodatage est en millisecondes, c'est pourquoi il est si grand.

Vous pouvez utiliser l'appel PHP date () pour formater cet horodatage à votre guise. Il suffit de diviser par 1 000 d’abord. En format américain standard, il serait 

$ mydate = date ('m d Y', $ timestamp); 

(où $ timestamp est 1365004652303)

Pour le formater dans le format que vous avez demandé (Y-m-d H: i: s), utilisez «Y-m-d H: i: s» comme chaîne de format (premier paramètre). Couper le texte commençant par "-".

$stamps = preg_split("/-/", $time);
$stamps[0] = $stamps[0]/1000; 
$mydate = date('Y-m-d H:i:s', $stamps[0]); 

Cela donne 2013-04-03 11:57:32

D'autres ont suggéré que 0500 est un décalage; Si tel est le cas, vous souhaiterez ajuster $ stamps [0] en conséquence. 

2
Scott C Wilson

Si votre date est comme /Date(-62135578800000)/, un entier positif ou négatif sans fuseau horaire:

$date = substr('/Date(-62135578800000)/', 6, -5);
$date = date('m/d/Y H:i:s', $date + date('Z', $date) * -1);
// 01/01/0001 05:00:00
1
Scott M. Sanders

L'exemple suivant utilise les classes preg_match() et DateTime:

$date = '/Date(1365004652303-0500)/';

// get the timestamp
$pattern = '~/Date\(([0-9]*)~';
preg_match($pattern, $date, $matches);
$timestamp = round(((int) $matches[1]) / 1000);

$dt = new DateTime();
$dt->setTimestamp($timestamp);

echo $dt->format('Y-m-d H:i:s');
0
hek2mgl

La réponse de Baba est très utile, mais elle ne couvre pas les 3 cas dont j'ai besoin:

  • L'horodatage peut être négatif
  • L'horodatage peut être inférieur à 10 chiffres
  • Le décalage GMT est peut-être manquant.

C'est ce que j'utilise pour obtenir l'horodatage:

$date_string = '/Date(-594262800300+0100)/';
preg_match('/([+-]?\d+)([+-]\d{4})?/', $date_string, $matches);
$timestamp = $matches[1] / 1000;
$hours = $matches[2] * 36; // Get the seconds
return $timestamp + $hours;

De nouveau, comme Ghigo l’a noté, cela n’est pas correct si le décalage contient des minutes, mais cela fonctionne dans mon cas.

0
Rumyana Ruseva

J'ai eu une expérience légèrement différente qui m'a amené à apporter quelques légères modifications à l'excellente réponse de Baba.

En utilisant la bibliothèque JSON de Newtonsoft pour coder les messages au format .NET, que j'envoie ensuite à notre site Web (la partie PHP), j'obtiens un espace avant le décalage du fuseau horaire et aucun caractère +/-.

J'ai également vu des nombres négatifs à partir de dates antérieures à la période, ce qui signifie que je devais prendre en charge le signe - avant la valeur en millisecondes.

J'ai modifié la regex à cela et cela fonctionne parfaitement pour moi:

^/Date(([-]?\d{10})(\d{3})\s?([+-]?\d{4}))/$

Les deux différences sont

[-]? avant la valeur en millisecondes à 10 chiffres et \s? avant le décalage du fuseau horaire.

Je mettrais cela comme un commentaire sur la réponse de Baba, mais mon manque de réputation ne me le permet pas. J'espère que cela me convient de poster ici car je pensais que cela pourrait être utile.

0
Dan Hobbs