ডেটটাইমে পিএইচপি টাইমস্ট্যাম্প


94

আপনি কেমন করে আমার strtotime এই রূপান্তর করতে পারেন জানেন, বা মূল্যের একটি অনুরূপ ধরনের মধ্যে পাস না তারিখসময় বস্তু?

আমার যে তারিখটি রয়েছে:

Mon, 12 Dec 2011 21:17:52 +0000

আমি যা চেষ্টা করেছি:

$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));

$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');

উপরেরটি সঠিক নয়। যদি আমি বিভিন্ন তারিখের সমস্ত একই তারিখ লুপ করি।

উত্তর:


163

DateTimeঅবজেক্টটি তৈরি করার জন্য আপনার স্ট্রিংটিকে টাইমস্ট্যাম্পে রূপান্তর করতে হবে না (আসলে এটির নির্মাতা আপনাকে এটি করার অনুমতি দেয় না, যেমন আপনি বলতে পারেন)। আপনি কেবল আপনার তারিখের স্ট্রিংটি DateTimeনির্মাণকারীর মতো করে দিতে পারেন:

// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);

বলা হচ্ছে, আপনার যদি স্ট্রিংয়ের পরিবর্তে কোনও টাইমস্ট্যাম্প ব্যবহার করতে চান তবে আপনি এটি ব্যবহার করে করতে পারেন DateTime::setTimestamp():

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

সম্পাদনা করুন (2014-05-07):

আমি আসলে এটি সম্পর্কে সচেতন ছিলাম না, তবে DateTimeকনস্ট্রাক্টর সরাসরি টাইমস্ট্যাম্পগুলি থেকে দৃষ্টান্ত তৈরির পক্ষে সমর্থন করেএই ডকুমেন্টেশন অনুসারে , আপনাকে যা করতে হবে তা হ'ল একটি @চরিত্রের সাথে টাইমস্ট্যাম্পটি পুনরায় চাপিয়ে দেওয়া :

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);

এটি দুর্দান্ত কাজ করে। আমি আগে এটি চেষ্টা করেছিলাম তবে অবশ্যই এটি যথেষ্ট সুযোগ দেওয়া উচিত হয়নি !!! ধন্যবাদ :))

18
এটি লক্ষ্য করুন new DateTime('@' . $timestamp) এবং $dt = new DateTime(); $dt->setTimestamp($timestamp)একইভাবে সময় অঞ্চলগুলি ব্যবহার করবেন না। আরও তথ্যের জন্য আমার উত্তর @ স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি/ 12038558/… দেখুন।
জন স্লেজার

42

যদিও @drrcknlsn দৃ as়ভাবে ডায়াটিমে টাইম স্ট্রিং রূপান্তর করার জন্য একাধিক উপায় রয়েছে তা বোঝার জন্য এটি গুরুত্বপূর্ণ যে এই বিভিন্ন উপায়ে একইভাবে টাইমজোনগুলির সাথে কাজ করে না।


বিকল্প 1 : DateTime('@' . $timestamp)

নিম্নলিখিত কোড বিবেচনা করুন:

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

strtotimeবিট ঘটিয়েছে সময় অঞ্চল তথ্য, এবং date_createফাংশন জিএমটি অনুমান ( Europe/Brussels)।

এই হিসাবে, আউটপুটটি নিম্নলিখিত হবে, আমি এটি কোন সার্ভারে চালিত করি তা নয়:

2011-12-12T13:17:52+00:00

বিকল্প 2: date_create()->setTimestamp($timestamp)

নিম্নলিখিত কোড বিবেচনা করুন:

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

আপনি এটি একই আউটপুট উত্পাদন আশা করতে পারেন। তবে, যদি আমি এই কোডটি বেলজিয়ামের একটি সার্ভার থেকে সম্পাদন করি তবে আমি নিম্নলিখিত আউটপুটটি পাই:

2011-12-12T14:17:52+01:00

date_createফাংশনের বিপরীতে , setTimestampপদ্ধতিটি 'Europe/Brussels'GMT এর পরিবর্তে সার্ভারের সময় অঞ্চল ( আমার ক্ষেত্রে) ধরে নেয় ।


স্পষ্টভাবে আপনার সময় অঞ্চল নির্ধারণ

আপনি যদি নিশ্চিত করতে চান যে আপনার আউটপুটটি আপনার ইনপুটটির টাইম জোনের সাথে মিলে যায়, তবে এটি সুস্পষ্টভাবে সেট করা ভাল।

নিম্নলিখিত কোড বিবেচনা করুন:

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

এখন, নিম্নলিখিত কোডটিও বিবেচনা করুন:

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

ইনপুটটির সাথে মিলে যাওয়ার জন্য আমরা আউটপুটটির সময় অঞ্চলটি স্পষ্টভাবে সেট করেছি বলে, উভয়ই একই (সঠিক) আউটপুট তৈরি করবে:

2011-12-12T21:17:52+08:00

27

সম্ভবত সবচেয়ে সহজ সমাধানটি কেবল:

DateTime::createFromFormat('U', $timeStamp);

যেখানে 'ইউ' অর্থ ইউনিক্সের যুগ। দস্তাবেজগুলি দেখুন: http://php.net/manual/en/datetime.createfromformat.php


4
এই পদ্ধতিটি
টাইমজোনকেও

4
@ বাউকভার্টিঘ এবং কোনটি নেই?
ফোরসবার্গ

4
@ বাউকভার্টিঘ এটি একটি ইউনিক্স টাইমস্ট্যাম্প! এটি আপনাকে অবজেক্ট তৈরি করার সময় টাইমজোন সমস্যা থেকে মুক্তি দেয়->setTimezoneকল করার আগে কেবল পছন্দসই টাইমজোনটি সেট করতে ব্যবহার করুন->format()
হিসাবরক্ষক

4
@ বাউকভার্টিঘ পিএইচপি ম্যানুয়াল থেকে এই বড় নোটটি পরীক্ষা করে দেখুন "$ টাইমজোন প্যারামিটার এবং বর্তমান টাইমজোনটি উপেক্ষা করা হয় যখন $ টাইম প্যারামিটার হয় ইউনিক্স টাইমস্ট্যাম্প (যেমন @ 946684800) হয় বা টাইমজোন নির্দিষ্ট করে (যেমন: 2010-01-28T15: 00: 00 + 02: 00)। "
হিসাবরক্ষক

4
ইউনিক্স টাইমস্ট্যাম্পগুলির টাইমজোন নেই, তারা সর্বদা সংজ্ঞা অনুসারে ইউটিসি হয়
the_nuts

0

এটি আমার সমাধান:

    function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s")
    {
        $date = new DateTime($date, new DateTimeZone($from));
        $date->setTimeZone(new DateTimeZone($to));
        return $date->format($targetFormat);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.