programing

HTTP 헤더에 사용된 날짜/시간 형식

cafebook 2023. 9. 5. 20:46
반응형

HTTP 헤더에 사용된 날짜/시간 형식

"Last-Modified" 및 "If-Modified-Since"와 같은 현대 HTTP 헤더에서 날짜/시간에 사용되는 형식과 그러한 형식에 따라 PHP에서 날짜/시간 문자열을 생성하는 방법을 설명하는 RFC는 무엇입니까?

일부 출처에서는 DateTime 클래스에 표시된 대로 RFC 2822를 사용하고 있습니다.D, d M Y H:i:s O형식, 하지만 내 테스트에 따르면, 이 형식은 생산합니다.+0000대신에GMT마지막에다른 시간대 지정자를 사용해 보았지만 아무 것도 입력하지 않았습니다.GMT마지막에, 내가 얻은 가장 가까운 결과는.UTC그러나 Firebug에서 보여주었듯이, 모든 사이트는GMTHTTP 헤더에 포함되어 있지 않습니다.+0000또는UTC.

그렇다면 실제로 사용되는 형식은 무엇이며 다른 사이트와 동일한 방식으로 날짜/시간 형식을 지정하는 방법은 무엇입니까?

여기에서 볼 수 있듯이 헤더에는 RFC2616 형식의 날짜 시간이 있습니다.

섹션에서 날짜 형식은 다음과 같습니다.

"Last-Modified" ":" HTTP-date

사용 예는 다음과 같습니다.

Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT

RFC2616의 또 다른 인용문:

모든 HTTP 날짜/시간 스탬프는 예외 없이 그리니치 표준시(GMT)로 표시되어야 합니다.

PHP에서는 형식을 사용할 수 있습니다.D, d M Y H:i:s T함수를 사용하는 경우gmdate()이 명령은 항상 GMT 오프셋/시간대로 날짜 시간을 반환합니다.

echo gmdate('D, d M Y H:i:s T');

사용하려는 경우DateTime확장명:

$dt = new DateTime('UTC');
#$dt = new DateTime('2013-01-01 12:00:00', new DateTimezone('UTC'));
echo $dt->format('D, d M Y H:i:s \G\M\T');

HTTP 1.1을 정의하는 RFC 2616을 살펴보겠습니다. https://www.rfc-editor.org/rfc/rfc2616#section-3.3

HTTP 응용 프로그램은 역사적으로 날짜/시간 스탬프의 표현을 위해 세 가지 다른 형식을 허용했습니다.

 Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
 Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
 Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format

첫 번째 형식은 인터넷 표준으로 선호되며 RFC 1123 [8](RFC 822 [9]의 업데이트)에 의해 정의된 고정 길이 하위 집합을 나타냅니다.

(...)

모든 HTTP 날짜/시간 스탬프는 예외 없이 그리니치 표준시(GMT)로 표시되어야 합니다.

그렇게DateTime::COOKIE또는Datetime::RFC850올바른 형식을 사용합니다.RFC에 따르면 선호되는 것은 다음과 같습니다.D, d M Y H:i:s T그것은 어떤 상수에 의해 정의되지 않습니다.DateTime학급.

GMT를 사용하려면 다음 코드로 충분해야 합니다.

gmdate('D, d M Y H:i:s T');

여기서 (지금) 정답은 rfc7231 - 섹션 7.1.1.1 날짜/시간 형식을 지정하고 다음과 같은 위치에 있습니다.HTTP-date의미론이 정의됩니다.

HTTP-date    = IMF-fixdate / obs-date

또한 우리는 그것을 볼 수 있습니다.

보낸 사람이 HTTP-date로 정의된 타임스탬프를 하나 이상 포함하는 헤더 필드를 생성하는 경우 보낸 사람IMF-fixdate 형식으로 이러한 타임스탬프를 생성해야 합니다.

" 헤더를 보내는 - 은 "modern time HTTP"입니다.HTTP-date은 형은다같습다니과음식과 .IMF-fixdate서식을 정하다

그래서 실제 질문에 답하기 위해서입니다.

현대 HTTP 헤더에서 날짜/시간에 사용되는 형식을 설명하는 RFC

은 그은것의정합알니다아야의를당의 를 알아야 합니다.IMF-fixdaterfc7231로 되어 .또한 다음과 같은 정의를 제공합니다.obs-date i.e. 무rfc850-date/asctime-date

     IMF-fixdate  = day-name "," SP date1 SP time-of-day SP GMT
     ; fixed length/zone/capitalization subset of the format
     ; see Section 3.3 of [RFC5322]

     day-name     = %x4D.6F.6E ; "Mon", case-sensitive
                  / %x54.75.65 ; "Tue", case-sensitive
                  / %x57.65.64 ; "Wed", case-sensitive
                  / %x54.68.75 ; "Thu", case-sensitive
                  / %x46.72.69 ; "Fri", case-sensitive
                  / %x53.61.74 ; "Sat", case-sensitive
                  / %x53.75.6E ; "Sun", case-sensitive


     date1        = day SP month SP year
                  ; e.g., 02 Jun 1982

     day          = 2DIGIT
     month        = %x4A.61.6E ; "Jan", case-sensitive
                  / %x46.65.62 ; "Feb", case-sensitive
                  / %x4D.61.72 ; "Mar", case-sensitive
                  / %x41.70.72 ; "Apr", case-sensitive
                  / %x4D.61.79 ; "May", case-sensitive
                  / %x4A.75.6E ; "Jun", case-sensitive
                  / %x4A.75.6C ; "Jul", case-sensitive
                  / %x41.75.67 ; "Aug", case-sensitive
                  / %x53.65.70 ; "Sep", case-sensitive
                  / %x4F.63.74 ; "Oct", case-sensitive
                  / %x4E.6F.76 ; "Nov", case-sensitive
                  / %x44.65.63 ; "Dec", case-sensitive
     year         = 4DIGIT

     GMT          = %x47.4D.54 ; "GMT", case-sensitive

     time-of-day  = hour ":" minute ":" second
                  ; 00:00:00 - 23:59:60 (leap second)

     hour         = 2DIGIT
     minute       = 2DIGIT
     second       = 2DIGIT

   Obsolete formats:

     obs-date     = rfc850-date / asctime-date

     rfc850-date  = day-name-l "," SP date2 SP time-of-day SP GMT
     date2        = day "-" month "-" 2DIGIT
                  ; e.g., 02-Jun-82

     day-name-l   = %x4D.6F.6E.64.61.79    ; "Monday", case-sensitive
            / %x54.75.65.73.64.61.79       ; "Tuesday", case-sensitive
            / %x57.65.64.6E.65.73.64.61.79 ; "Wednesday", case-sensitive
            / %x54.68.75.72.73.64.61.79    ; "Thursday", case-sensitive
            / %x46.72.69.64.61.79          ; "Friday", case-sensitive
            / %x53.61.74.75.72.64.61.79    ; "Saturday", case-sensitive
            / %x53.75.6E.64.61.79          ; "Sunday", case-sensitive


     asctime-date = day-name SP date3 SP time-of-day SP year
     date3        = month SP ( 2DIGIT / ( SP 1DIGIT ))
                  ; e.g., Jun  2

DateTime 확장 기능을 사용하면 RFC7231 HTTP/1.1 하이퍼텍스트 전송 프로토콜: 의미와 내용, 7.1.1장 날짜/시간 형식을 참조하는 RFC7231 상수를 사용할 수 있습니다.

$httpDate = $dateTime->format(DateTimeInterface::RFC7231);

은 실제로 있는 다른 된 것과 입니다.D, d M Y H:i:s \G\M\T

탄소를 통해:

Carbon::now()->setTimezone('GMT')->format("D, d M Y H:i:s T")

언급URL : https://stackoverflow.com/questions/21120882/the-date-time-format-used-in-http-headers

반응형