স্ট্রিংটিকে তারিখ এবং তারিখের সময় রূপান্তর করা হচ্ছে


292

যদি আমি এর ফর্ম্যাটে একটি পিএইচপি স্ট্রিং আছে mm-dd-YYYY(উদাহরণস্বরূপ, 10-16-2003 জন্য) আমি সঠিকভাবে করে একটি রূপান্তর না Dateএবং তারপর একটি DateTimeবিন্যাস মধ্যে YYYY-mm-dd? আমি উভয়ের জন্য জিজ্ঞাসা করার একমাত্র কারণ Dateএবং DateTimeকারণ হ'ল আমার একটি স্পটে এবং অন্যটি আলাদা স্পটে spot

উত্তর:


480

এটিকে আবার রূপান্তর করতে strtotime()আপনার প্রথম তারিখে ব্যবহার করুন date('Y-m-d'):

$time = strtotime('10/16/2003');

$newformat = date('Y-m-d',$time);

echo $newformat;
// 2003-10-16

নোট ফরোয়ার্ড স্ল্যাশ ব্যবহার মধ্যে একটি পার্থক্য নেই করুন /এবং হাইফেন -মধ্যে strtotime()ফাংশন। পিএইচপি নেট থেকে উদ্ধৃতি দিতে:

মি / ডি / ওয়াই বা ডিএমআই ফর্ম্যাটের তারিখগুলি বিভিন্ন উপাদানগুলির মধ্যে বিভাজকটি দেখে দ্ব্যর্থহীন: যদি বিভাজক একটি স্ল্যাশ (/) হয় তবে আমেরিকান এম / ডি / ওয়াই ধরে নেওয়া হয়; যদিও বিভাজকটি যদি কোনও ড্যাশ (-) বা ডট (।) হয় তবে ইউরোপীয় ডিএমআই ফর্ম্যাটটি ধরে নেওয়া হবে।

সম্ভাব্য অস্পষ্টতা এড়ানোর জন্য, আইএসও 8601 (ওয়াইওয়াইওয়াই-এমএম-ডিডি) তারিখগুলি বা ডেটটাইম :: ক্রিয়েটফর্মফর্ম্যাট () সম্ভব হলে ব্যবহার করা ভাল।


11
এটি কাজ করবে না। পিএইচপি এই ইনপুটটিকে ডিডি-এমএম-ওয়াইওয়াই হিসাবে ব্যাখ্যা করবে।
ম্যাথু

আমি আমার কোডটিতে কিছুটা আরও ব্যাখ্যা যুক্ত করেছি, ধন্যবাদ @ কনফোর্স
আইবু

9
আরও ভাল সমাধানের জন্য পরবর্তী উত্তরটি পড়ুন
ম্যানুয়েল বিট্টো

@ ডেলিভ করুন আপনার তারিখের স্ট্রিং সম্ভবত সঠিক তারিখ নয়।
Ibu

8
এটি কাজ করে না কারণ এই উত্তরটি বিভ্রান্তিকর। strtotimeনির্দিষ্ট ফর্ম্যাট গ্রহণ করে। আপনি এটিকে যা খাওয়াতে পারবেন না। এজন্য DateTime::createFromFormatপরিবর্তে ব্যবহার করা উচিত strtotime। দুঃখের বিষয়, যে কেউ মনোযোগ দিতে পারে না এই উত্তরটির অনেকগুলি আপত্তি রয়েছে। আজকাল সব কপি পেস্ট।
NB

432

আপনাকে এম / ডি / ওয়াই এবং এমডিওয়াই ফর্ম্যাটগুলির সাথে সতর্ক হওয়া দরকার। পিএইচপি /মানে মি / ডি / ওয়াই এবং -ডিএমওয়াই মানে। আমি এই ক্ষেত্রে ইনপুট ফর্ম্যাটটি স্পষ্টভাবে বর্ণনা করব:

$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');

এইভাবে আপনি একটি নির্দিষ্ট ব্যাখ্যার ঝাঁকুনিতে নেই।


37
কেন এটি গ্রহণযোগ্য উত্তর নয় তা নিয়ে কৌতূহলী ... এটি strtotime()ফাংশনের সান্নিধ্যের উপর নির্ভর করার চেয়ে অনেক বেশি নমনীয় ।
jzimmerman2011

9
এটি উল্লেখ করা গুরুত্বপূর্ণ যে পিএইচপি ডেটটাইম ক্লাসটি পিএইচপি সংস্করণ 5.2 থেকে পাওয়া যায় এবং 5.3 থেকে ফ্রেমফর্ম্যাট তৈরি হয়
ডিয়েগো নিমো

14
প্রতিটি ফাংশনের মতো, আপনার অবশ্যই এটি সমর্থন করা উচিত যে এটি ন্যূনতম সংস্করণে সমর্থন করে। তবে পিএইচপি 5.2 ইওএল ছিল জানুয়ারী 2011. কারও আর এটি চালানো উচিত নয়; এই লোকদের খাওয়ানো কেবল তাদের পুরানো, অনিরাপদ সফ্টওয়্যার চালাতে সক্ষম করে তুলছে।
ম্যাথু

@ ম্যাথু হ্যাঁ, সঠিক। তবে আপনি এখনই কখনও পাননি, এমনকি আজও আমি একটি পিএইচপি 4.1 সংস্করণটি ইনস্টল পেয়েছি ...
রোল্যান্ড

29

তারিখটি বিশ্লেষণ করতে আপনার ব্যবহার করা উচিত: ডেটটাইম :: ক্রিয়েটফর্মফর্ম্যাট ();

উদা:

$dateDE = "16/10/2013";
$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");

তবে সাবধান, কারণ এটি দিয়ে ক্রাশ হবে:

PHP Fatal error: Call to a member function format() on a non-object 

প্রথমে আপনাকে যাচাই করতে হবে প্রথমে ফর্ম্যাটিংটি ঠিকঠাক হয়েছে:

$dateDE = "16/10/2013";
$dateObj = \DateTime::createFromFormat("d.m.Y", $dateDE);
if (!$dateObj)
{
    throw new \UnexpectedValueException("Could not parse the date: $date");
}
$dateUS = $dateObj->format("m/d/Y");

এখন ক্রাশ হওয়ার পরিবর্তে, আপনি একটি ব্যতিক্রম পাবেন যা আপনি ধরতে পারবেন, প্রচার করতে পারেন ইত্যাদি

$ তারিখের ভুল বিন্যাস রয়েছে, এটি "16.10.2013" হওয়া উচিত;


লক্ষ্য করুন যে $ তারিখঅবজকে সেভাবে পরীক্ষা করা কেবলমাত্র নিশ্চিত করবে যে ফর্ম্যাটটি মাস্কের সাথে মেলে, না যে তারিখটি আসলে বৈধ। উদাহরণস্বরূপ, 99/99/2010 এর মতো তারিখটি এই চেকটি পাস করবে যেহেতু এটি মি / ডি / ওয়াইয়ের সাথে মেলে তবে এটি সাধারণত আপনি অনুমতি দিতে চান এমন তারিখ নয়। এই উত্তরটি এই পরিস্থিতিকে সম্বোধন করে -> স্ট্যাকওভারফ্লো.com
a/10120725/995014

22
$d = new DateTime('10-16-2003');

$timestamp = $d->getTimestamp(); // Unix timestamp
$formatted_date = $d->format('Y-m-d'); // 2003-10-16

সম্পাদনা করুন: সার্ভারের ডিফল্ট নয়, পছন্দসই টাইম জোনের জন্য তারিখ তৈরির বিষয়টি নিশ্চিত করতে আপনি ডেটটাইমজোনটি ডেটটাইম () নির্মাতাকেও পাস করতে পারেন।


6
আমি বিশ্বাস করি এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে কারণ 16 মাস অবৈধ।
ম্যাথু

এটি উল্লেখ করা গুরুত্বপূর্ণ যে পিএইচপি ডেটটাইম ক্লাসটি পিএইচপি সংস্করণ 5.2 এবং গেটটাইমস্ট্যাম্প 5.3 থেকে পাওয়া যায়
ডিয়েগো নিমো

2

প্রথম তারিখের জন্য

$_firstDate = date("m-d-Y", strtotime($_yourDateString));

নতুন তারিখের জন্য

$_newDate = date("Y-m-d",strtotime($_yourDateString));

2

আপনার যদি dd-mm-yyy ফর্ম্যাট থাকে তবে পিএইচপি-তে এটি প্রত্যাশার মতো কাজ করবে না। পিএইচপি নথিতে তাদের নীচে গাইডলাইন রয়েছে।

মি / ডি / ওয়াই বা ডিএমআই ফর্ম্যাটের তারিখগুলি বিভিন্ন উপাদানগুলির মধ্যে বিভাজকটি দেখে দ্ব্যর্থহীন: যদি বিভাজক একটি স্ল্যাশ (/) হয় তবে আমেরিকান এম / ডি / ওয়াই ধরে নেওয়া হয়; যদিও বিভাজকটি যদি কোনও ড্যাশ (-) বা ডট (।) হয় তবে ইউরোপীয় ডিএমআই ফর্ম্যাটটি ধরে নেওয়া হবে।

সুতরাং, আপনি নিজের ইচ্ছামত ব্যবহার করতে পারবেন না। আপনার যখন এটির সাথে dd / মিমি / yyyy ফর্ম্যাটটি ব্যবহার করার চেষ্টা করা হবে তখন এটি মিথ্যা অপসারণ করবে। আপনি নিম্নলিখিত সঙ্গে টুইট করতে পারেন।

$date = "23/02/2013";
$timestamp = strtotime($date);
if ($timestamp === FALSE) {
  $timestamp = strtotime(str_replace('/', '-', $date));
}
echo $timestamp; // prints 1361577600

1

যেমন আমাদের "07 / মে / 2018" তারিখ রয়েছে এবং আমাদের mysql সামঞ্জস্যপূর্ণ হিসাবে "2018-05-07" তারিখের প্রয়োজন

if (!empty($date)) {
    $timestamp = strtotime($date);
    if ($timestamp === FALSE) {
         $timestamp = strtotime(str_replace('/', '-', $date));
     }
         $date = date('Y-m-d', $timestamp);
  }

এটা আমার জন্য কাজ করে. উপভোগ করুন :)


0

যেহেতু কেউ এটি উল্লেখ করেনি, এখানে অন্য উপায় রয়েছে:

$date = date_create_from_format("m-d-Y", "10-16-2003")->format("Y-m-d");


0

আপনি যদি এখনও অন্য ফর্ম্যাটগুলি গ্রহণ করার সময় ইউরোপীয় স্টাইলের ফর্ম্যাটগুলির জন্য (আমেরিকান অর্ডারিং (মাস, তারিখ, বছর) ব্যবহার করে তারিখগুলি গ্রহণ করতে চান তবে ডেটটাইম শ্রেণিটি বাড়িয়ে দিতে পারেন:

/**
 * Quietly convert European format to American format
 *
 * Accepts m-d-Y, m-d-y, m.d.Y, m.d.y, Y-m-d, Y.m.d
 * as well as all other built-in formats
 * 
 */
class CustomDateTime extends DateTime 
{
  public function __construct(string $time="now", DateTimeZone $timezone = null) 
  {
    // convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y (substr avoids microtime error)
    $time = str_replace(['-','.'], '/', substr($time, 0, 10)) . substr($time, 10 );

    parent::__construct($time, $timezone);
  }
}

// usage:
$date = new CustomDateTime('7-24-2019');
print $date->format('Y-m-d');

// => '2019-07-24'

অথবা, আপনি এমডিওয়াই এবং আউটপুট ওয়াইএমডি গ্রহণের জন্য একটি ফাংশন তৈরি করতে পারেন:

/**
 * Accept dates in various m, d, y formats and return as Y-m-d
 * 
 * Changes PHP's default behaviour for dates with dashes or dots.
 * Accepts:
 *   m-d-y, m-d-Y, Y-m-d,
 *   m.d.y, m.d.Y, Y.m.d,
 *   m/d/y, m/d/Y, Y/m/d,
 *   ... and all other formats natively supported 
 * 
 * Unsupported formats or invalid dates will generate an Exception
 * 
 * @see https://www.php.net/manual/en/datetime.formats.date.php PHP formats supported
 * @param  string $d various representations of date
 * @return string    Y-m-d or '----' for null or blank
 */
function asYmd($d) {
  if(is_null($d) || $d=='') { return '----'; }

  // convert m-d-y or m.d.y to m/d/y to avoid PHP parsing as d-m-Y
  $d = str_replace(['-','.'], '/', $d);

  return (new DateTime($d))->format('Y-m-d');
}

// usage:

<?= asYmd('7-24-2019') ?>

// or

<?php echo asYmd('7-24-2019'); ?>

0

যে কোনও স্ট্রিং ব্যবহার থেকে তারিখ তৈরি করতে:
$ তারিখ = তারিখটাইম :: তৈরিফ্রোমফর্ম্যাট ('dmy H: i', '01 -01-01 01:00 '); প্রতিধ্বনি $ তারিখ-> ফর্ম্যাট ('Ymd H: i');


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