পিএইচপি ডেটটাইমকে ইউটিসিতে রূপান্তর করুন


90

কোনও লাইব্রেরি ব্যবহার না করে আশা করি কোনও তারিখের স্ট্যাম্পটিকে ইউটিসিতে রূপান্তর করার জন্য আমার সহজ প্রয়োজন (

উত্তর:


30

গেটটাইমোন এবং সেট টাইমজোন চেষ্টা করে দেখুন, উদাহরণটি দেখুন

(তবে এটি একটি ক্লাস ব্যবহার করে)

হালনাগাদ:

কোনও ক্লাস ছাড়াই আপনি এরকম কিছু চেষ্টা করতে পারেন:

$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");

দ্রষ্টব্য: আপনারও টাইমজোনটি আবার মূলতে সেট করতে হবে


55
gmdateআপনাকে ইউটিসিতে ডিফল্ট টাইমজোন পরিবর্তনের পরিবর্তে ব্যবহার করা উচিত । কারণ gmdateস্বয়ংক্রিয়ভাবে ইউটিসি ব্যবহার করে।
অকর্মা

30
-1 কারণ আপনি এটির জন্য গ্লোবাল ডিফল্ট টাইমজোনটি পরিবর্তন করতে চান না। এটি কেবল অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া জিজ্ঞাসা করে।
ওয়ার্ড বেকার

@ পিফিল এখানে 'এসজেড' কী?
শহীদ করিমি

4
আমি মনে করি এটি "Yd-mTG ..." এর পরিবর্তে "Ym-dTG ..." হওয়া উচিত
অ্যালেক্স অ্যাঞ্জেলিকো

লারাভেল প্রকল্পে এটি আমার পক্ষে কাজ করছে না। এটি একই তারিখে প্রত্যাবর্তন করবে
ধর্মেন্দ্র তুলি

109

ব্যবহারের strtotime দেওয়া পংক্তি (স্থানীয় সময় হিসেবে ব্যাখ্যা) এবং ব্যবহার থেকে একটি টাইমস্ট্যাম্প জেনারেট করতে gmdate একটি ফরম্যাট ইউটিসি তারিখ ফিরে হিসাবে এটি পেতে।

উদাহরণ

অনুরোধ হিসাবে, এখানে একটি সহজ উদাহরণ:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));

7
একটি ছোট উদাহরণ হতে পারে?
চেরোভিম

4
@ আরচৌভিম এটি প্রয়োজনীয় মনে করবেন না, তবে যাইহোক একটি যুক্ত করুন ... আশা করি এটি সাহায্য করবে।
poke

4
gmdate () হ'ল পিএইচপি ফাংশনগুলির মধ্যে একটি, আমি আশা করি দীর্ঘদিন আগে আমি হোঁচট খেয়েছি। nl2br, কেউ?
চার্লি শ্লিয়েসার

4
জিএমটি এবং ইউটিসি সর্বদা এক হয় না।
জে শেঠ

4
@ পোকে জিএমটি দিবালোক সংরক্ষণের সময়কে সম্মান করে, ইউটিসি দেয় না এবং সে কারণেই এটি ব্যবহার করা হয় যাতে আপনাকে অন্য কোনও কারণের কারণ তৈরি করতে হবে না
Necro

72

ডেটটাইম ব্যবহার:

$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok

$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC

প্রশ্নটি বলে যে একটি টাইমস্ট্যাম্পকে একটি টাইমস্ট্যাম্পে রূপান্তর করে এবং ডেটটাইম কোনও টাইমস্ট্যাম্পকে ইনপুট হিসাবে গ্রহণ করে না। আপনাকে এটিকে কোনও স্ট্রিতে রূপান্তর করতে হবে তারপরে এটিকে আবার রূপান্তর করতে হবে।


14

YYYY-MM-HH dd: মিমি: এস এই ফর্ম্যাটে আপনার যদি একটি তারিখ থাকে তবে আপনি আপনার "ডেটটাইম স্ট্রিং" এর শেষে একটি ইউটিসি যুক্ত করে পিএইচপি চালিত করতে পারেন এবং রূপান্তর করতে স্ট্রোটটাইম ব্যবহার করতে পারেন।

date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";

এটি এটি মুদ্রণ করবে:

2009-01-01 13:00:00
2009-06-01 14:00:00

এবং আপনি দেখতে পাচ্ছেন এটি দিবালোকের সময় সাশ্রয় সময় সমস্যারও যত্ন করে।

এটি সমাধান করার জন্য একটি অদ্ভুত উপায় .... :)


আমি কেন সত্যই বুঝতে পারছি না যে ওপি আপনার পরামর্শটি বেছে :D
নিল

@ php_nub_qq সম্ভবত কারণ এটি পুরো স্ক্রিপ্টের জন্য সময় অঞ্চল পরিবর্তন করে কাজ করে যা সম্ভবত পছন্দসই নয় এবং এর অনিচ্ছাকৃত পরিণতিও হতে পারে।
felwithe

@ ফিলিভিথ আপনি যদি প্রথম পংক্তিটি এড়িয়ে না যান, যা কেবল প্রদর্শনের জন্য
php_nub_qq

11

স্থানীয় সময় অঞ্চল স্ট্রিংটিকে ইউটিসি স্ট্রিতে রূপান্তর করুন।
যেমন নিউজিল্যান্ড সময় অঞ্চল

$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s"); 
echo ($output);
  • এনজেডডিটি: ইউটিসি + ১৩: 00
    যদি $ ডেটটাইম = "2016-02-01 00:00:01", $ আউটপুট = "2016-01-31 11:00:01";
    যদি $ ডেটটাইম = "2016-02-29 23:59:59", $ আউটপুট = "2016-02-29 10:59:59";
  • এনজেডএসটি: ইউটিসি + 12: 00
    যদি $ ডেটটাইম = "2016-05-01 00:00:01", $ আউটপুট = "2016-04-30 12:00:01";
    যদি $ ডেটটাইম = "2016-05-31 23:59:59", $ আউটপুট = "2016-05-31 11:59:59";

https://en.wikedia.org/wiki/Time_in_New_Z Thailand


5

আপনি যদি পিএইচপি-র ডেটটাইম ক্লাসটি ব্যবহার করতে আপত্তি করেন না , যা পিএইচপি 5.2.0 থেকে পাওয়া যায়, তবে বিভিন্ন পরিস্থিতিতে এমন পরিস্থিতি রয়েছে যা আপনার পরিস্থিতির সাথে খাপ খায়:

  1. আপনার যদি $givenDtডেটটাইম অবজেক্ট থাকে যা আপনি ইউটিসিতে রূপান্তর করতে চান তবে এটি এটি ইউটিসিতে রূপান্তর করবে:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. আপনার যদি $givenDtপরে আসলটির প্রয়োজন হয় তবে ক্লোন করা বস্তুর রূপান্তর করার আগে আপনি বিকল্পভাবে প্রদত্ত ডেটটাইম অবজেক্টটি ক্লোন করতে চাইতে পারেন:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. আপনার যদি কেবল একটি ডেটটাইম স্ট্রিং থাকে, যেমন $givenStr = '2018-12-17 10:47:12', তবে প্রথমে আপনি একটি ডেটটাইম অবজেক্ট তৈরি করেন এবং তারপরে এটি রূপান্তর করুন। এইটি পিএইচপি'র $givenStrকনফিগার করা টাইমজোনটিতে রয়েছে বলে মনে করুন।

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. প্রদত্ত ডেটটাইম স্ট্রিং যদি আপনার পিএইচপি কনফিগারেশনের সময়ের চেয়ে কিছু সময় অঞ্চলে থাকে তবে সঠিক সময় অঞ্চল সরবরাহ করে ডেটটাইম অবজেক্টটি তৈরি করুন ( পিএইচপি সমর্থনকারী টাইমজোনগুলির তালিকা দেখুন )। এই উদাহরণে আমরা আমস্টারডামের স্থানীয় সময় অঞ্চল অনুমান করি:

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
    

4

যেহেতু স্ট্রোটোটাইমের নির্দিষ্ট ইনপুট ফর্ম্যাট প্রয়োজন, ডেটটাইম :: ক্রিয়েটফর্মফর্ম্যাট ব্যবহার করা যেতে পারে ( পিএইচপি 5.3+ প্রয়োজন )

// set timezone to user timezone
date_default_timezone_set($str_user_timezone);

// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);

// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');

// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));

// return timezone to server default
date_default_timezone_set($str_server_timezone);

4

আমি মাঝে মাঝে এই পদ্ধতিটি ব্যবহার করি:

// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");

// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));

কাজ সব অধিকাংশ সময়।


4
এখানে দুটি সমস্যা। প্রথমে আপনার বিয়োগ করা উচিত নয় আপনার অফসেটটি যুক্ত করা উচিত। দ্বিতীয়ত, স্থানীয় সময় অঞ্চলটি বর্তমানে ডিএসটিতে থাকলে এবং কাঙ্ক্ষিত তারিখটি ডিএসটিতে না থাকলে এটি কাজ করে না। অফসেটটি এক ঘন্টা বন্ধ হয়ে যাবে। ্য মচক্সফন্দক্স. হ্যাঁ, এটি সময়ের বেশিরভাগ ক্ষেত্রে কাজ করে তবে সর্বদা তা নয়।
আজান



0

চেষ্টা করুন

প্রতিধ্বনি তারিখ ('F d Y', স্ট্রোটোটাইম ('2010-01-19 00:00:00'));

আউটপুট হবে:

জানুয়ারী 19 2010

অন্যান্য আউটপুট দেখতে আপনার ফর্ম্যাট সময় পরিবর্তন করা উচিত


0

যে কোনও টাইমস্ট্যাম্প থেকে অন্য সময় অঞ্চল থেকে অন্য টাইমস্ট্যাম্প ফর্ম্যাট করতে সাধারণ উদ্দেশ্য সাধারণকরণের ফাংশন। রিলেশনাল ডাটাবেসে বিভিন্ন টাইম অঞ্চল থেকে ব্যবহারকারীদের ডেটটাইমস্ট্যাম্পগুলি সঞ্চয় করার জন্য খুব দরকারী। ডাটাবেস তুলনার জন্য টাইমস্ট্যাম্পটি ইউটিসি হিসাবে সংরক্ষণ করুন এবং ব্যবহার করুনgmdate('Y-m-d H:i:s')

/**
 * Convert Datetime from any given olsonzone to other.
 * @return datetime in user specified format
 */

function datetimeconv($datetime, $from, $to)
{
    try {
        if ($from['localeFormat'] != 'Y-m-d H:i:s') {
            $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
        }
        $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
        $datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
        return $datetime->format($to['localeFormat']);
    } catch (\Exception $e) {
        return null;
    }
}

ব্যবহার:

$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta'];

$to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC'];

datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"

0

বিকল্পভাবে আপনি এটি চেষ্টা করতে পারেন:

<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>

এই আউটপুট হবে:

2017-10-25 17:13:20 এশিয়া / সিঙ্গাপুর

আপনি যদি কেবলমাত্র পঠনযোগ্য তারিখ প্রদর্শন করতে চান তবে আপনি এটি কোনও পাঠ্য ইনপুট বাক্সের মান বৈশিষ্ট্যের ভিতরে ব্যবহার করতে পারেন।

আপনি যদি আপনার অঞ্চল / দেশটি দেখাতে না চান তবে 'ই' মুছে ফেলুন।


0

পেতে নিম্নলিখিত ধাপগুলি অনুসরণ করুন ইউটিসি সময় এর কোনো সময় অঞ্চল ব্যবহারকারীর স্থানীয় সিস্টেমের মধ্যে সেট (এই ওয়েব অ্যাপ্লিকেশনের ইউটিসি বিভিন্ন সময়ের অঞ্চলগুলোকে সংরক্ষণ করার জন্য প্রয়োজন হবে):

  1. জাভাস্ক্রিপ্ট (ক্লায়েন্ট-পাশ):

    var dateVar = new Date();
    var offset = dateVar.getTimezoneOffset();
    //getTimezoneOffset - returns the timezone difference between UTC and Local Time
    document.cookie = "offset="+offset;
    
  2. পিএইচপি (সার্ভার-সাইড):

    public function convert_utc_time($date)
    {
        $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:'';
        if($time_difference != ''){
            $time = strtotime($date);
            $time = $time + ($time_difference*60); //minutes * 60 seconds
            $date = date("Y-m-d H:i:s", $time);
        } //on failure of js, default timezone is set as UTC below
        return $date;
    }
    ..
    ..
    //in my function
    $timezone = 'UTC';
    $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s')
    echo strtotime($date. ' '. $timezone)
    

-1

ফিল প্যাফোর্ডের উত্তরের উন্নতি হিসাবে (আমি তাঁর 'Yd-mTG: i: sz' বুঝতে পারি নি এবং তিনি টাইমজোনটি ফিরিয়ে দেওয়ার পরামর্শ দিয়েছিলেন)। সুতরাং আমি এটি প্রস্তাব করছি (আমি সরল / পাঠ্যে এইচএমটিএল ফর্ম্যাটটি পরিবর্তন করে জটিল ...):

<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");

// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";

// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";

// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n"; 
?>

4
ফিলের উত্তরে এটি কীভাবে উন্নত হয় তা বোঝাতে আপনার উত্তরটি সম্পাদনা করা উচিত । আপনি কোডটিতে কী পরিবর্তন করেছেন এবং কেন এটি ভাল?
কোডি গ্রে

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