सही समय क्षेत्र में तारीख कैसे दिखाएं?


19

मेरे पास सामग्री प्रकार में एक डेटटाइम रेंज फ़ील्ड (फ़ील्ड_डेट) है। एक बार जब मैं अपना कंटेंट टाइप कर लेता हूं तो मैं स्टार्ट डेट सेट कर देता हूं:

2017-02-27 19:30:01

यहाँ छवि विवरण दर्ज करें

अब मैं मूल्य प्राप्त करना चाहता हूं और तारीख को अन्य प्रारूप में दिखाना चाहता हूं, इसलिए निम्न कोड का उपयोग करने का प्रयास करें:

// Loading the node.
$node = Node::load(2100);
// Getting the start date value.
$date = $node->field_date->value;
// Printing to see what is the output.
dpm($node->field_date->value);
$date = strtotime($date);
// Printing my timezone.
dpm(drupal_get_user_timezone());
// Applying my custom format.
$date = \Drupal::service('date.formatter')->format($date, 'custom', 'Y-m-d H:i:s', drupal_get_user_timezone());
// Printing to see the output.
dpm($date);

यह मेरा आउटपुट है:

// It's fine.
2017-02-28T00:30:01
// Its fine.
America/New_York
// This is not what I waiting for. I'm waiting here: 2017-02-27 19:30:01
2017-02-28 00:30:01

तो, सही समय क्षेत्र में तारीख कैसे दिखाएं?

जवाबों:


22

मुझे लगता है कि समस्या के कुछ बारीकियों के साथ क्या करना है strtotime()

strtotime()बस किसी भी स्ट्रिंग के बारे में ले सकते हैं, और इसे यूनिक्स टाइमस्टैम्प में बदल सकते हैं। समस्या यह है कि जब स्ट्रिंग में एक स्पष्ट समय क्षेत्र नहीं होता है, तो यह उस चीज़ का उपयोग करेगा जो इसके द्वारा निर्धारित है date_default_timezone_get()। इसे वर्तमान उपयोगकर्ता से सेट किया जाना चाहिए, हालांकि (यह खाता प्रॉक्सी द्वारा सेट किया गया है)। हालाँकि, जिस स्ट्रिंग को आप खींच रहे हैं, वह $node->field_date->valueUTC में निहित है। दूसरे शब्दों में, मुझे लगता है कि स्ट्रिंग की strtotime()व्याख्या 'अमेरिका / न्यू_यॉर्क' के रूप में की जा रही है न कि 'यूटीसी' की।

अच्छी खबर यह है कि आप अपनी स्थिति को बहुत सरल कर सकते हैं। दिनांक सीमा के लिए फ़ील्ड आइटम में चार भाग होते हैं

  • UTC में 'वैल्यू' एक स्ट्रिंग के रूप में शुरुआत की तारीख है
  • 'start_date' एक DrupalDateTime ऑब्जेक्ट है जो 'मान' का प्रतिनिधित्व करता है
  • UTC में एक स्ट्रिंग के रूप में 'end_value' अंतिम तिथि है
  • 'end_date' एक DrupalDateTime ऑब्जेक्ट है जो 'end_value' का प्रतिनिधित्व करता है

एक सादे तिथि समय क्षेत्र के लिए वे हैं

  • 'मान' UTC में एक स्ट्रिंग के रूप में तारीख है
  • 'दिनांक' एक DrupalDateTime ऑब्जेक्ट है जो 'मान' का प्रतिनिधित्व करता है

तो, आप DrupalDateTime()सीधे ऑब्जेक्ट के साथ काम कर सकते हैं। इसके अलावा, वहdate.formatter सेवा को उपयोगकर्ता द्वारा पृष्ठ को डिफ़ॉल्ट रूप से देखने के लिए (उपयोगकर्ता की सक्रिय भाषा का उपयोग करने के अलावा) द्वारा उचित समय क्षेत्र में उपयोग करना चाहिए।

मुझे संदेह है कि ऐसा कुछ काम करेगा

$node = Node::load(2100);
$start_date = $node->field_date->start_date;
$formatted = \Drupal::service('date.formatter')->format(
  $start_date->getTimestamp(), 'custom', 'Y-m-d H:i:s P'
);

नोट मैंने 'P' फॉर्मेट प्लेसहोल्डर को वहां जोड़ा है ताकि आप देख सकें कि सिस्टम किस समय का उपयोग करने के लिए सोच रहा है।

सुनिश्चित करें कि आपके पास व्यवस्थापक / कॉन्फ़िगरेशन / क्षेत्रीय / सेटिंग्स पर उचित टाइमज़ोन सेट अप है, और आपका उपयोगकर्ता टाइमज़ोन वही है जो आप अपेक्षा कर रहे हैं। यह भी सुनिश्चित करें कि आपके php.ini में उचित समय-क्षेत्र सेट है (यह date.timezoneसेटिंग है); जब यह सेट नहीं किया जाता है तो अजीब चीजें होती हैं (और मेरे सिर के ऊपर से, मुझे याद नहीं है कि अगर इंस्टॉलर में चेतावनी का कारण बनता है या सेट नहीं होने पर स्टेटस रिपोर्ट में। मुझे समस्या याद है, लेकिन यह नहीं है कि क्या यह मिला है प्रतिबद्ध)।


1
@mpdonadio मदद के लिए धन्यवाद! मुझे dateDrupalDateTime तक पहुँचने की सुविधा के बारे में नहीं पता था । जिज्ञासा से बाहर आपने यह कैसे पता लगाया? मैं यह पता लगाने में सक्षम था कि मेरा क्षेत्र किस प्रकार का था, DateTimeItemलेकिन वहाँ यह स्पष्ट नहीं है कि उस वर्ग के लिए date(या value) सार्वजनिक सदस्य है।
पजानो

1
@Pzanno मैं ड्रुपल 8 कोर डेटाइम.मॉडल सह-अनुरक्षक हूं, और अन्य बहुत सारी कोर डेट / टाइम से संबंधित सामान भी मेरे काम आता है :) गुण जादू के तरीके हैं। अगर आप गौर DateTimeItem::propertyDefinitions()करेंगे, तो आप देखेंगे कि क्या उजागर हुआ है। फिर DateTimeComputed::getValue()देखें कि यह कैसे काम करता है। सभी आइटम वर्गों की उस तरह से जांच की जा सकती है, लेकिन केवल एक मुट्ठी भर गणना मूल्यों का उपयोग किया जाता है। काश, एपीआई के लिए इसे उजागर करने का एक बेहतर तरीका होता।
mpdonadio

@mpdonadio स्पष्टीकरण के लिए धन्यवाद! मैंने इस तथ्य को याद किया कि उन्हें भी परिभाषित किया गया था DateTimeItem::propertyDefinitions()। मुझे लगा कि कुछ जादू के तरीके हो रहे हैं, लेकिन यह समझना चाहते हैं कि ये कैसे बनाए गए थे ताकि मैं बेहतर समझ पाऊं कि कैसे अन्य क्षेत्रों तक भी पहुंच बनाई जाए। जैसा कि आपने कहा था कि एपीआई को उजागर किया जाए तो अच्छा होगा, लेकिन इससे मदद मिलती है। एक बार फिर धन्यवाद।
पोज़ानो

1
मेरे मामले में, मुझे $node->field_date->dateइसके बजाय, करना था $node->field_date->start_date
मार्कोस बुर्के

2
इस प्रतिक्रिया के लिए Props के रूप में यह Drupal प्रलेखन मैं कभी नहीं मिला है का सबसे जानकारीपूर्ण टुकड़ा है।
रयान एच

6

PHP DateTime के साथ टाइमज़ोन रूपांतरण से निपटने के आधार पर मैंने अपने कोड को इसमें संशोधित किया:

$node = Node::load(2100);
$userTimezone = new DateTimeZone(drupal_get_user_timezone());
$gmtTimezone = new DateTimeZone('GMT');
$myDateTime = new DateTime($node->field_date->value, $gmtTimezone);
$offset = $userTimezone->getOffset($myDateTime);
$myInterval = DateInterval::createFromDateString((string)$offset . 'seconds');
$myDateTime->add($myInterval);
$result = $myDateTime->format('Y-m-d H:i:s');
dpm($result);

और अब मेरी उत्पादन तिथि ठीक है:

2017-02-27 19:30:01

यह काम। लेकिन मुझे यकीन है कि Drupal API का उपयोग करने का एक तरीका है।


1
मैंने अपनी पिछली टिप्पणी हटा दी। DrupalDateTime Drupal उपयोगकर्ता के टाइमज़ोन के लिए समायोजित नहीं करता है।
20

मेरे मामले में मैंने इसे किसी भी तारीख फ़ंक्शन कॉल से पहले इस्तेमाल किया:date_default_timezone_set(drupal_get_user_timezone());
रोजर

इसके लिए धन्यवाद। यह वास्तव में drupal.stackexchange.com/q/256490/2089 के साथ मेरी मदद करता है
कॉलन

@ कोलन एक खुशी आपकी मदद करता है, अगर आपको लगता है कि मेरा उत्तर उपयोगी है तो मुझे लगता है कि आप दूसरे उत्तर की भी जांच कर सकते हैं।
एड्रियन सीआईडी ​​अल्मागुएर

4

मैं आमतौर पर इसे इस तरह से हल करता हूं:

node = Node::load(1);    
$date_original= new DrupalDateTime( $node->field_date->value , 'UTC' );     
$result = \Drupal::service('date.formatter')->format( $date_original->getTimestamp(), 'custom', 'Y-m-d H:i:s'  );    
dpm( $result );

2

यह मेरे लिए काम किया:

// Take the timestamp.
$timestamp = $form_state->getValue($form_field)->getTimestamp();
// Convert to UTC - the way its saved in database.
$date = DrupalDateTime::createFromTimestamp($timestamp, 'UTC');
// Add on the current entity.
$this->entity->{$db_field}->value = $date->format("Y-m-d\TH:i:s");

यह मेरे लिए भी काम करता है `$ dDate = DrupalDateTime :: createFromTimestamp ($ form_state-> getValue ('service_date') -> getTimestamp (), 'UTC'); // इस तरह का उपयोग करें। $ dDate-> प्रारूप ('Ymd \ TH: i: s'); `
योगेश कुशवाहा

1

यह कोड मेरे लिए काम कर रहा है।

// set use timezone
userTimezone = new DateTimeZone(drupal_get_user_timezone());
// set gmt timezone
$gmtTimezone = new DateTimeZone('GMT');
// Take the timestamp.
$start_date = $val['field_start_time_value'];    
$startDateTime = new DateTime($start_date, $gmtTimezone);
$offset = $userTimezone->getOffset($startDateTime);
$startInterval = DateInterval::createFromDateString((string)$offset . 'seconds');
$startDateTime->add($startInterval);
$result = $startDateTime->format('Y-m-d H:i:s');

0

इनमें से किसी भी अन्य उत्तर ने मेरे लिए काम नहीं किया। यह वही है जो मैंने अंत में समाप्त किया:

$range_start = DrupalDatetime::createFromTimestamp((int)$start_date); // unix timestamp
$range_start->setTimezone(new \Datetimezone('EST'));
$node->field_date_range->value = format_date(
  $range_start->getTimestamp() , 'custom', 'Y-m-d\TH:i:s', 'EST');

0

मैं दिनांक के साथ काम करने के लिए इस स्निपेट का उपयोग करता हूं:

<?php
class MyApp extends ControllerBase
{
    public function output() 
    {
        $dtime = DateTime::createFromFormat("d/m/Y - H:I:s", "22/12/1999 - 22:55:12", $this->getDateTimeZone());
        $time = $dtime->format('r');
        // My code goes here
    }

    private function getDateTimeZone()
    {
        return new DateTimeZone(drupal_get_user_timezone());
    }
}

आप यहाँ डेटाटाइम ऑब्जेक्ट के बारे में अधिक जानकारी प्राप्त कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.