문자열을 Date 및 DateTime으로 변환


292

mm-dd-YYYY(예 : 10-16-2003) 형식의 PHP 문자열이있는 경우 어떻게 형식 을 a로 변환 Date한 다음 ? DateTime형식으로 변환 YYYY-mm-dd합니까? 나는 모두에게 유일한 이유 DateDateTime내가 한 자리에 하나, 그리고 다른 자리에 다른 사람을 필요로하기 때문에입니다.

답변:


480

사용 strtotime()후 첫 데이트에 date('Y-m-d')다시 변환 :

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

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

echo $newformat;
// 2003-10-16

함수 에서 슬래시 /와 하이픈 -을 사용하는 것에는 차이 가 strtotime()있습니다. php.net에서 인용하려면 :

m / d / y 또는 dmy 형식의 날짜는 다양한 구성 요소 사이의 구분 기호를 보면 명확 해집니다. 구분 기호가 슬래시 (/)이면 미국식 m / d / y로 가정됩니다. 반면 구분 기호가 대시 (-) 또는 점 (.)이면 유럽 dmy 형식이 가정됩니다.

잠재적 인 모호성을 피하려면 가능한 경우 ISO 8601 (YYYY-MM-DD) 날짜 또는 DateTime :: createFromFormat ()을 사용하는 것이 가장 좋습니다.


11
작동하지 않습니다. PHP는 해당 입력을 DD-MM-YYYY로 해석합니다.
Matthew

@konforce
Ibu

9
더 나은 솔루션을 위해 다음 답변을 읽으십시오
Manuel Bitto

@delive 날짜 문자열이 올바른 날짜가 아닐 가능성이 높습니다.
Ibu

8
이 답변이 오도되기 때문에 작동하지 않습니다. strtotime특정 형식을 허용합니다. 아무 것도 먹이를 줄 수 없습니다. 그렇기 때문에 DateTime::createFromFormat대신 사용해야합니다 strtotime. 안타깝게도이 답변에는주의를 기울일만한 너무 많은 공짜가 있습니다. 요즘은 모든 복사 붙여 넣기입니다.
NB

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()기능 의 단점에 의존하는 것보다 훨씬 유연 합니다.
jzimmerman2011

9
PHP DateTime 클래스는 PHP 버전 5.2부터 사용할 수 있으며 5.3 이후 createFromFormat을 사용할 수 있음 을 지적하는 것이 중요합니다.
Diego Nemo

14
모든 기능과 마찬가지로 지원해야하는 최소 버전을 충족하는지 확인해야합니다. 그러나 PHP 5.2 EOL은 2011 년 1 월입니다. 아무도 더 이상 실행하지 않아야합니다. 이러한 사람들에게 음식을 제공하는 것은 구식의 안전하지 않은 소프트웨어를 실행할 수있게합니다.
Matthew

@Matthew 예, 맞습니다. 그러나 당신은 지금도, 심지어 오늘도 PHP4.1 버전이 여전히 설치되어 있음을 발견했습니다 ...
Roland

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
Kilian Perdomo Curbelo

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 개월이 유효하지 않기 때문에 예외가 발생한다고 생각합니다.
Matthew

PHP DateTime 클래스는 PHP 버전 5.2부터 사용할 수 있으며 getTimestamp 는 5.3부터 사용할 수 있다는 점을 지적하는 것이 중요합니다.
Diego Nemo

2

첫 데이트

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

새로운 날짜

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

2

PHP에서 dd-mm-yyyy 형식을 사용하면 예상대로 작동하지 않습니다. PHP 문서에는 아래 지침이 있습니다.

m / d / y 또는 dmy 형식의 날짜는 다양한 구성 요소 사이의 구분 기호를 보면 명확 해집니다. 구분 기호가 슬래시 (/)이면 미국식 m / d / y로 가정됩니다. 반면 구분 기호가 대시 (-) 또는 점 (.)이면 유럽 dmy 형식이 가정됩니다.

따라서 원하는대로 사용할 수 없습니다. 이것과 함께 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 / May / 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 '); echo $ date-> format ( 'Ymd H : i');

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.