स्ट्रिंग को दिनांक और दिनांक समय पर परिवर्तित करना


292

यदि मेरे पास प्रारूप में PHP स्ट्रिंग है mm-dd-YYYY(उदाहरण के लिए, 10-16-2003), तो मैं इसे कैसे ठीक से Dateऔर फिर एक DateTimeप्रारूप में परिवर्तित कर सकता हूं YYYY-mm-dd? एकमात्र कारण मैं दोनों के लिए पूछता हूं Dateऔर DateTimeइसलिए कि मुझे एक स्थान पर एक की जरूरत है, और दूसरे को अलग स्थान पर।

जवाबों:


480

इसे वापस बदलने के लिए strtotime()अपनी पहली तारीख पर उपयोग करें date('Y-m-d'):

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

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

echo $newformat;
// 2003-10-16

ध्यान दें कि फ़ंक्शन में आगे स्लैश /और हाइफ़न का उपयोग करने के बीच अंतर है । Php.net से उद्धृत करने के लिए:-strtotime()

M / d / y या dmy स्वरूपों में तिथियां अलग-अलग घटकों के बीच विभाजक को देखकर अव्यवस्थित होती हैं: यदि विभाजक स्लैश (/) है, तो अमेरिकी m / d / y मान लिया जाता है; जबकि यदि विभाजक पानी का छींटा (-) या डॉट (।) है, तो यूरोपीय डमी प्रारूप मान लिया गया है।

संभावित अस्पष्टता से बचने के लिए, आईएसओ 8601 (YYYY-MM-DD) दिनांक या DateTime :: createFromFormat () का उपयोग करना सबसे अच्छा है।


11
यह काम नहीं करेगा। PHP उस इनपुट को DD-MM-YYYY के रूप में व्याख्या करेगा।
मैथ्यू

मैंने अपने कोड में थोड़ा और स्पष्टीकरण जोड़ा, धन्यवाद @konforce
Ibu

9
बेहतर समाधान के लिए अगला उत्तर पढ़ें
मैनुअल बिट्टो

@ अपनी डेट स्ट्रिंग को सही तरीके से पूरा न करें।
इबू

8
यह काम नहीं करता क्योंकि यह उत्तर भ्रामक है। strtotimeकुछ स्वरूपों को स्वीकार करता है। आप इसे जो भी खिला सकते हैं। इसलिए DateTime::createFromFormatइसके स्थान पर इसका उपयोग किया जाना चाहिए strtotime। अफसोस की बात है कि इस जवाब में किसी के भी ध्यान देने के लिए बहुत अधिक उत्थान हैं। यह सब इन दिनों कॉपी पेस्ट है।
एनबी

432

आपको m / d / Y और mdY स्वरूपों से सावधान रहने की आवश्यकता है। PHP /का अर्थ है m / d / Y और -मतलब dmY। मैं स्पष्ट रूप से इस मामले में इनपुट प्रारूप का वर्णन करूंगा:

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

इस तरह आप एक निश्चित व्याख्या की सनक में नहीं हैं।


37
क्यों यह स्वीकार किए जाते हैं जवाब के रूप में उत्सुक ... यह strtotime()समारोह के quirks पर भरोसा करने की तुलना में बहुत अधिक लचीला है ।
jzimmerman2011 21

9
यह इंगित करना महत्वपूर्ण है कि php DateTime वर्ग PHP संस्करण 5.2 और createFromFormat के बाद से 5.3
डिएगो निमो

14
प्रत्येक फ़ंक्शन के साथ, आपको यह देखना चाहिए कि क्या यह न्यूनतम संस्करण से मिलता है जिसे आपको समर्थन करना चाहिए। लेकिन PHP 5.2 EOL जनवरी 2011 था। किसी को भी इसे नहीं चलाना चाहिए; उन लोगों के लिए खानपान सिर्फ उन्हें पुराना, असुरक्षित सॉफ्टवेयर चलाने में सक्षम बनाता है।
मैथ्यू

@ मैथ्यू हाँ, सही है। लेकिन आप कभी नहीं, आज भी मुझे एक PHP4.1 संस्करण अभी भी स्थापित मिला ...
रोलैंड

29

दिनांक को पार्स करने के लिए, आपको उपयोग करना चाहिए: DateTime :: createFromFormat ();

उदाहरण के लिए:

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

अब दुर्घटनाग्रस्त होने के बजाय, आपको एक अपवाद मिलेगा, जिसे आप पकड़ सकते हैं, प्रचार कर सकते हैं, आदि।

$ dateDE का गलत प्रारूप है, यह "16.10.2013" होना चाहिए;


ध्यान दें कि $ dateObj की जाँच इस तरह से केवल यह सुनिश्चित करेगी कि प्रारूप मास्क से मेल खाता है, न कि यह कि तिथि वास्तव में मान्य है। उदाहरण के लिए, 99/99/2010 जैसी कोई तारीख इस चेक को पास करेगी क्योंकि यह m / d / Y से मेल खाता है लेकिन यह ऐसी तारीख नहीं है जिसे आप आमतौर पर अनुमति देना चाहते हैं। यह उत्तर इस स्थिति को संबोधित करता है -> stackoverflow.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

संपादित करें: आप वांछित समय क्षेत्र के लिए दिनांक के निर्माण को सुनिश्चित करने के लिए DateTimeZone से DateTime () निर्माता को भी पास कर सकते हैं, सर्वर डिफॉल्ट को नहीं।


6
मेरा मानना ​​है कि यह एक अपवाद है क्योंकि 16 महीने अमान्य है।
मैथ्यू

यह कहना महत्वपूर्ण है कि php DateTime वर्ग PHP संस्करण 5.2 और getTimestamp के बाद से 5.3 से उपलब्ध है
डिएगो निमो

2

पहली तारीख के लिए

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

नई तारीख के लिए

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

2

यदि आपके पास dd-mm-yyyy प्रारूप है तो PHP में यह अपेक्षा के अनुरूप काम नहीं करेगा। PHP डॉक्यूमेंट में उनके पास गाइडलाइन है।

M / d / y या dmy स्वरूपों में तिथियां अलग-अलग घटकों के बीच विभाजक को देखकर अव्यवस्थित होती हैं: यदि विभाजक स्लैश (/) है, तो अमेरिकी m / d / y मान लिया जाता है; जबकि यदि विभाजक पानी का छींटा (-) या डॉट (।) है, तो यूरोपीय डमी प्रारूप मान लिया गया है।

इसलिए, आप अपनी इच्छानुसार उपयोग नहीं कर सकते। जब आपका dd / mm / yyyy फॉर्मेट इस के साथ प्रयोग करने की कोशिश करेगा तो यह FALSE हटा देगा। आप निम्नलिखित के साथ ट्वीक कर सकते हैं।

$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

यदि आप यूरोपीय शैली प्रारूपों के लिए अमेरिकी ऑर्डरिंग (महीने, तारीख, वर्ष) का उपयोग करके तारीखों को स्वीकार करना चाहते हैं (दिन, महीने, वर्ष के रूप में डैश या अवधि का उपयोग करके) करते हुए, तो आप DateTime वर्ग का विस्तार कर सकते हैं:

/**
 * 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'

या, आप mdY और आउटपुट Ymd को स्वीकार करने के लिए एक फ़ंक्शन बना सकते हैं:

/**
 * 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

किसी भी स्ट्रिंग उपयोग से दिनांक बनाने के लिए:
$ date = DateTime :: createFromFormat ('dmy H: i', '01 -01-01 01:00 '); गूंज $ तारीख-> प्रारूप ('Ymd H: i');

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