সঠিক সময় অঞ্চলে একটি তারিখটি কীভাবে প্রদর্শিত হবে?


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->valueকরছেন তা ইউটিসিতে অন্তর্নিহিত। অন্য কথায়, আমি মনে করি যে স্ট্রিংটি বিশ্লেষণ করা strtotime()হচ্ছে 'আমেরিকা / নিউ_ইয়র্ক' হিসাবে ব্যাখ্যা করা হচ্ছে, 'ইউটিসি' নয়।

সুসংবাদটি হ'ল আপনি নিজের পরিস্থিতিকে অনেক সহজ করতে পারেন। একটি তারিখের পরিসরের ক্ষেত্র আইটেমটি চারটি অংশ নিয়ে গঠিত

  • 'মান' ইউটিসি-তে স্ট্রিং হিসাবে শুরু করার তারিখ
  • 'start_date' হ'ল 'মান' উপস্থাপনকারী একটি DrupalDateTime অবজেক্ট
  • ইউটিসির স্ট্রিং হিসাবে 'end_value' শেষ তারিখ
  • 'end_date' হ'ল 'end_value' উপস্থাপনকারী একটি DrupalDateTime অবজেক্ট

একটি সরল তারিখের সময় ক্ষেত্রের জন্য তারা

  • 'মান' ইউটিসিতে স্ট্রিং হিসাবে তারিখ
  • 'তারিখ' হ'ল 'মান' উপস্থাপনকারী একটি ড্রুপালডেটটাইম অবজেক্ট

সুতরাং, আপনি DrupalDateTime()সরাসরি অবজেক্টের সাথে কাজ করতে পারেন । এছাড়াও, সেই date.formatterপরিষেবাটি ব্যবহারকারীর দ্বারা পৃষ্ঠাটি ডিফল্টরূপে দেখতে যথাযথ টাইমজোনটি টানতে হবে (ব্যবহারকারীর সক্রিয় ভাষা ব্যবহারের পাশাপাশি) language

আমি সন্দেহ করি এরকম কিছু কাজ করবে

$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'
);

দ্রষ্টব্য আমি সেখানে 'পি' ফর্ম্যাট স্থানধারক যুক্ত করেছি যাতে আপনি দেখতে পাচ্ছেন যে সিস্টেমটি কী টাইমজোন ব্যবহার করছে তা thinks

আপনার অ্যাডমিন / কনফিগারেশন / আঞ্চলিক / সেটিংসে যথাযথ টাইমজোন সেট আপ হয়েছে এবং আপনার ব্যবহারকারীর টাইমজোনটি আপনি প্রত্যাশা করছেন তা নিশ্চিত করুন। এছাড়াও নিশ্চিত করুন যে আপনার php.ini এ সঠিক টাইমজোন সেট আছে (এটি date.timezoneসেটিং); অদ্ভুত জিনিসগুলি ঘটে যখন এটি সেট না করা হয় (এবং আমার মাথার উপরের অংশটি থেকে, আমি স্মরণ করতে পারি না যে এটি ইনস্টলারের মধ্যে বা সেট না করা অবস্থায় স্থিতির প্রতিবেদনে কোনও সতর্কতা সৃষ্টি করে কিনা I আমি সমস্যাটি মনে করি, তবে তা পাইনি কিনা) সংঘটিত)।


1
@ এমপিডোনাদিও সহায়তার জন্য ধন্যবাদ! dateড্রুপালডেটটাইম অ্যাক্সেস করার বৈশিষ্ট্যটি সম্পর্কে আমি জানতাম না । কৌতূহলের বাইরে আপনি এটি কীভাবে আবিষ্কার করলেন? আমি বুঝতে পেরেছিলাম যে আমার ক্ষেত্রটি ধরণের ছিল DateTimeItemতবে সেখানে এই শ্রেণীর জন্য একজন date(বা value) জনসাধারণ আছে তা স্পষ্ট মনে হয় না ।
পজান্নো

1
@ প্লাজানো আমি ড্রুপাল 8 কোর ডেটটাইম.মডিউল সহ-রক্ষণাবেক্ষণকারী এবং আরও অনেকগুলি মূল তারিখ / সময় সম্পর্কিত জিনিস আমার পথে আসে :) সম্পত্তিগুলি হ'ল যাদু পদ্ধতি। আপনি যদি তাকান DateTimeItem::propertyDefinitions(), আপনি দেখতে পাবেন কি উদ্ভাসিত হয়। তারপরে দেখুন DateTimeComputed::getValue()কীভাবে এটি কাজ করে। সমস্ত আইটেম ক্লাসগুলি সেভাবে পরীক্ষা করা যেতে পারে তবে কেবল হাতে গোনা কয়েকটি গণনা করা মান। আমি এপিআই-তে প্রকাশ করার আরও ভাল উপায় হতে চাই।
mpdonadio

@ এমপিডোনাদিও ব্যাখ্যার জন্য ধন্যবাদ! আমি এমনকি তারা সংজ্ঞায়িত করা হয়েছে যে মিস DateTimeItem::propertyDefinitions()। আমি বুঝতে পেরেছিলাম যে এখানে কিছু জাদু পদ্ধতি ঘটছে, তবে কীভাবে এটি তৈরি করা হয়েছে তা বুঝতে চেয়েছিলাম যাতে আমি অন্যান্য ক্ষেত্রগুলিতে কীভাবে অ্যাক্সেস করতে পারি তা আরও ভালভাবে বুঝতে পারি। যেমন আপনি বলেছেন যে API টি প্রকাশিত হলে এটি দুর্দান্ত হবে তবে এটি সহায়তা করে। আবার ধন্যবাদ.
প্যাজনো

1
আমার ক্ষেত্রে, আমার $node->field_date->dateপরিবর্তে , আমাকে করতে হয়েছিল $node->field_date->start_date
মার্কোস বুয়ার্ক

2
এই প্রতিক্রিয়াটির প্রপস হিসাবে এটি আমি খুঁজে পেয়েছি এমন ড্রুপাল ডকুমেন্টেশনের সর্বাধিক তথ্যযুক্ত টুকরো।
রায়ান এইচ

6

পিএইচপি ডেটটাইমের সাথে টাইমজোন রূপান্তর পরিচালনার উপর ভিত্তি করে আমি আমার কোডটি এতে পরিবর্তন করেছি:

$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

এইটা কাজ করে. তবে আমি নিশ্চিত যে ড্রুপাল এপিআই ব্যবহার করে এটি করার একটি উপায় আছে।


1
আমি আমার আগের মন্তব্যটি সরিয়েছি। ড্রুপালডেটটাইম ড্রুপাল ব্যবহারকারীর টাইমজোনটির জন্য সামঞ্জস্য করে না।
Oknate

আমার ক্ষেত্রে আমি কেবল কোনও তারিখ ফাংশন কল করার আগে এটি ব্যবহার করেছি: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");

এটি আমার জন্যও কাজ করে `D dDate = DrupalDateTime :: createFromTimestamp ($ form_state-> getValue ('service_date') -> getTimestamp (), 'UTC'); // এটি ব্যবহার করুন। D d তারিখ-> ফর্ম্যাট ('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());
    }
}

আপনি এখানে ডেটটাইম অবজেক্ট সম্পর্কে আরও তথ্য পেতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.