Başka bir soru dateTime

6 Cevap php

Şu anda bu biçimde bir tarih var

2010-03-03 10:39:18

MySQL bir TIMESTAMP alan olan. Ben Solr adında bir arama motoru için bu formatta tarih olması gerekir:

1995-12-31T23:59:59Z

Burada tarihleri ​​hakkında kendi web sitesinden bazı metin:

Solr expects dates to be in UTC when indexing. The format for this date field is of the form 1995-12-31T23:59:59Z, and is a more restricted form of the canonical representation of dateTime http://www.w3.org/TR/xmlschema-2/#dateTime. The trailing "Z" designates UTC time and is mandatory. Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z All other components are mandatory.

Ben burada SO başka Q bu kodu verildi, ama çalışmıyor. Solr bir "geçersiz zaman string" hakkında yakınır:

$solr_date = date('c', (strtotime($date_from_mysql)); // doesn't work

Yankısını zaman $solr_date, firar Z, yukarıda belirtilen yok. Teşekkürler.

6 Cevap

Neden sadece UTC dönüştürmek değil mi?

    $datetime = "2010-01-19 00:00:00";
    echo "Datetime Before: ".$datetime."<br />";
    $dttostr = strtotime("2010-01-19 00:00:00");
    echo "Datetime After: ".formatToUTC($dttostr)."<br />";
    echo "System Timezone: ".date_default_timezone_get()."<br />";

    function formatToUTC($passeddt) {
        // Get the default timezone
        $default_tz = date_default_timezone_get();

        // Set timezone to UTC
        date_default_timezone_set("UTC");

        // convert datetime into UTC
        $utc_format = date("Y-m-d\TG:i:s\Z", $passeddt);

        // Might not need to set back to the default but did just in case
        date_default_timezone_set($default_tz);

        return $utc_format;
    }

Her şeyden önce, bu MySQL tarih / saati sütunları herhangi belirli bir dize biçiminde depolanan olmadığını belirtmekte yarar var. Onları yazdırırken dizelere dönüştürülür ve bunları nasıl şekilleneceğini seçebilirsiniz.

Eğer saf MySQL çözüm istiyorsanız, sorunun alakalı fonksiyonlar CONVERT_TZ() UTC zamanı elde etmek ve gerektiği gibi DATE_FORMAT() bunu görüntülemek için içerir. Örneğin:

SELECT CURRENT_TIMESTAMP,
    CONVERT_TZ(CURRENT_TIMESTAMP, '+01:00', '+00:00'),
    DATE_FORMAT(CONVERT_TZ(CURRENT_TIMESTAMP, '+01:00', '+00:00'), '%Y-%m-%dT%H:%i:%sZ')

Sorun DAMGASI kolonlar gibi bilgileri depolamak için izin yok çünkü önceden dilimini bilmek zorunda olduğunu temelde. Ayrıca, yaz saati konuları bulabilirsiniz.

PHP hakkında, date() fonksiyonu sadece bir sınırlı değil, biçim kodu birleştirmek sağlar:

<?php
$ts = strtotime($date_from_mysql);
$solr_date date('Y-m-d', $ts) . 'T' . date('H:i:s', $ts) . 'Z';
?>

sadece kullanmak

gmdate('Y-m-d\TH:i:s\Z', $time);

Bu kesmek biraz ama benim için çalışıyor:

$to = date('c', strtotime($to)).'.000Z';

Burada başka bir alternatif bulunuyor:

$datetime = new DateTime('2010-01-19 00:00:00');
echo str_replace('+00:00', 'Z', $datetime->format('c'));

See it in action

İşte PHP çözümdür:

Mktime fonksiyon argümanları dayalı (2010-03-03 10:39:18) tarih dize bölmek.

$solr_date = date('c', mktime($year,$month,$date, $h, $m , $s)); # it will work