source

safari의 날짜가 잘못되었습니다.

manysource 2022. 12. 24. 17:45

safari의 날짜가 잘못되었습니다.

 alert(new Date('2010-11-29'));

chrome, ff는 문제가 없지만 safari는 "date date"라고 외칩니다.왜요?

edit : ok, 다음 코멘트에 따라 문자열 해석을 사용하여 다음을 시도했습니다.

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

2018년 3월 22일 편집 : 사람들이 아직 도착하지 않은 것 같습니다 - 오늘 저는moment ★★★★★★★★★★★★★★★★★」date-fns.이치노

Safari가 제대로 작동하지 않는다는 이유만으로 새로운 라이브러리를 구현하는 것은 무리이며 regex는 과잉입니다.다음은 Oneliner입니다.

console.log (new Date('2011-04-12'.replace(/-/g, "/")));

" "yyyy-MM-dd으로는 지원되지 않는 Date이를 동일한 을 할 는 않습니다.파이어폭스는 이를 지원하는 것처럼 보이지만 다른 브라우저가 동일한 기능을 할 것으로 기대하지는 않는다.

지원되는 문자열은 다음과 같습니다.

  • MM-dd-yyy
  • yyy/MM/dd
  • MM/dd/yyy
  • MMM dd, yyy
  • MM dd, yyy

DateJs는 표준이 아닌 날짜 형식을 해석하는 데 적합한 라이브러리인 것 같습니다.

편집: 방금 ECMA-262 표준을 확인했습니다.섹션 15.9.1.15에서 인용:

날짜 시간 문자열 형식

ECMAScript는 ISO 8601 확장 포맷의 단순화를 기반으로 날짜 시간의 문자열 교환 형식을 정의합니다.형식은 다음과 같습니다.YYY-MM-DDTHH:mm:ss.sssZ 필드는 다음과 같습니다.

  • YYY는 그레고리력으로 한 해의 10진수입니다.
  • "-"(하이폰)은 문자열에 문자 그대로 두 번 표시됩니다.
  • MM은 1월 1일부터 12월 12일까지의 월입니다.
  • DD는 01 ~ 31의 요일입니다.
  • 문자열에 문자 그대로 "T"가 표시되어 시간 요소의 시작을 나타냅니다.
  • HH는 오전 0시 이후 10진수 2자리로 경과한 완료시간 수입니다.
  • ":"(예:)는 문자열에 문자 그대로 두 번 표시됩니다.
  • mm 는, 시간의 개시 후의 완료 시간(분단위)으로, 소수점 2 자리수입니다.
  • ss는 분 시작 후 10진수 2자리 이후의 완료 초수입니다.
  • "." (도트)는 문자 그대로 문자열에 표시됩니다.
  • sss는 10진수 3자리 숫자로서 두 번째 시작 이후의 완료 밀리초 수입니다."." 및 milliseconds 필드는 모두 생략할 수 있습니다.
  • Z는 시간 표현 hh:mm 뒤에 "Z"(UTC의 경우) 또는 "+" 또는 "-"로 지정된 시간대 오프셋입니다.

이 형식에는 날짜 전용 양식이 포함됩니다.

  • YYY
  • YYY-MM
  • YYY-MM-DD

또한 옵션 시간대 오프셋이 추가된 시간 전용 양식도 포함됩니다.

  • THH:mm
  • THH:mm:ss
  • THH:mm:ss.ss.ss

또, 상기의 임의의 조합이 되는 「날짜 시각」도 포함됩니다.

YYY-MM-DD는 표준 사양에 포함되어 있는 것 같습니다만, Safari는 지원하지 않습니다.

업데이트: datesjs 문서를 보고 이를 사용하면 다음과 같은 코드를 사용하여 문제를 해결할 수 있습니다.

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy");
var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy");
var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd");
var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");

나도 비슷한 문제에 직면해 있었다. Date.Parse("DATESTRING")는 Chrome 59 Safari( 10. Chrome(버전 59.0.3071.15)는 하지 않았습니다.

사파리:

Date.parse("2017-01-22 11:57:00")
NaN

크롬:

Date.parse("2017-01-22 11:57:00")
1485115020000

가 있었던 을 dateString으로 하는 이었습니다."T" ( . (예:dateString.replace(/ /g,"T"))

사파리:

Date.parse("2017-01-22T11:57:00")
1485086220000

크롬:

Date.parse("2017-01-22T11:57:00")
1485115020000

Safari가 로컬 TZ(UTC보다 8시간 늦음)로 응답을 반환했기 때문에 Safari 브라우저로부터의 응답은 Chrome 브라우저에 표시되는 응답보다 8시간(2800000ms) 적습니다.

같은 TZ에서 두 시간을 모두 얻으려면

사파리:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

크롬:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

나는 문제를 해결하기 위해 순간을 이용한다.예를들면

var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();

대부분의 브라우저에서 솔루션을 작동시키려면 이 형식으로 날짜 개체를 생성해야 합니다.

(year, month, date, hours, minutes, seconds, ms)

예:

dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11
alert(dateObj.getTime()); //gives back timestamp in ms

IE, FF, Chrome 및 Safari에서 정상적으로 동작합니다.더 오래된 버전도.

IE Dev Center: 날짜 객체(JavaScript)

Mozilla Dev 네트워크: 날짜

string을 Date fromat으로 변환(서버 타임존을 알아야 합니다)

new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()  

여기서 +08:00 = 서버의 표준 시간대

저도 같은 문제가 있었어요.그리고 나서 나는 모멘트를 사용했다.Js.문제가 사라졌습니다.

문자열에서 모멘트를 작성할 때 먼저 문자열이 알려진 ISO 8601 형식과 일치하는지 확인한 후 알려진 형식을 찾을 수 없는 경우 새 날짜(문자열)로 폴백합니다.

경고: 브라우저의 문자열 구문 분석 지원에 일관성이 없습니다.어떤 형식을 지원해야 하는지에 대한 지정이 없기 때문에 일부 브라우저에서 작동하는 것은 다른 브라우저에서 작동하지 않습니다.

ISO 8601 문자열 이외의 일관된 결과를 구문 분석하려면 String + Format을 사용해야 합니다.

예.

var date= moment(String);

★★★★★★를하는 분date-fns는 할 수 있다.parseISO합니다.

무효한

import _format from 'date-fns/format';

export function formatDate(date: string, format: string): string {
  return _format(new Date(date), format);
}

오류 시 이 는 사파리 던지기 입니다.Invalid date.

★★★★★★
을 고치기 는 다음과 같은것을 해야 합니다.

import _format from 'date-fns/format';
import _parseISO from 'date-fns/parseISO';

export function formatDate(date: string, format: string): string {
  return _format(_parseISO(date), format);
}

브라우저가 ISO 8601(또는 그 날짜 전용 서브셋)을 지원하기를 원할 수도 있지만, 이는 해당되지 않습니다.내가 알고 있는 모든 브라우저(적어도 내가 사용하는 미국/영어 로케일에서)는 끔찍한 US를 해석할 수 있다.MM/DD/YYYY맷합니니다다

날짜 부분이 이미 있는 경우 대신 날짜를 사용할 수 있습니다.UTC()를 사용하지 않으면YYYY-MM-DD정규 있는 하고, 그을 식, 나, 나, 나, 나, 나, 나, them, them, them, them, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format, format,Date.UTC().

하이잭은 ?Date날짜 표시로요?의존관계 없음, 최소 + gzip = 280 B

사파리 브라우저에서도 같은 문제가 발생하고 있습니다.

var date = new Date("2011-02-07");
console.log(date) // IE you get ‘NaN’ returned and in Safari you get ‘Invalid Date’

해결책은 다음과 같습니다.

var d = new Date(2011, 01, 07); // yyyy, mm-1, dd  
var d = new Date(2011, 01, 07, 11, 05, 00); // yyyy, mm-1, dd, hh, mm, ss  
var d = new Date("02/07/2011"); // "mm/dd/yyyy"  
var d = new Date("02/07/2011 11:05:00"); // "mm/dd/yyyy hh:mm:ss"  
var d = new Date(1297076700000); // milliseconds  
var d = new Date("Mon Feb 07 2011 11:05:00 GMT"); // ""Day Mon dd yyyy hh:mm:ss GMT/UTC 

아래 형식을 사용하면 모든 브라우저에서 작동합니다.

var year = 2016;
var month = 02;           // month varies from 0-11 (Jan-Dec)
var day = 23;

month = month<10?"0"+month:month;        // to ensure YYYY-MM-DD format
day = day<10?"0"+day:day;

dateObj = new Date(year+"-"+month+"-"+day);

alert(dateObj); 

//"2016년 3월 23일(수) 00:00:00 GMT+0530(IST)"과 같이 출력됩니다.

//이 경우 IST로 표시된 현재 시간대에 있으므로 UTC 시간대로 변환할 수 있습니다.

alert(dateObj.toUTCSting);

//지금 출력은 "2016년 3월 22일 화요일 18:30:00 GMT"입니다.

여기서 dateObj는 GMT 형식으로 시각을 표시하고 날짜와 시간이 이에 따라 변경되었음을 유의하십시오.

toUTCing 기능은 그리니치 자오선에서 해당 시간을 검색합니다.이 작업은 현재 시간대와 그리니치 자오선 시간대의 시간 차이를 설정함으로써 수행됩니다.

위의 경우 변환 전 시간은 2016년 3월 23일 00:00시입니다.그리고 GMT+0530(IST) 시간을 GMT로 변환한 후(이 경우 주어진 타임스탬프에서 기본적으로 5.30시간을 뺀 값) 시간은 2016년 3월 22일 18.30시간(정확히 첫 번째 시간보다 5.30시간 늦음)을 반영합니다.

사용할 수 있는 날짜 개체를 타임스탬프로 변환하려면

alert(dateObj.getTime());

// 출력은 이 "http8671400000"과 비슷합니다.

그러면 당시의 고유한 타임스탬프를 얻을 수 있습니다.

가장 좋은 방법은 다음 형식을 사용하는 것입니다.

new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);

이는 모든 브라우저에서 지원되며 문제를 일으키지 않습니다.월은 0부터 11까지 기재되어 있습니다.

는 제가 입니다.0의 한 월 일 앞YYYY-MM-DD맷합니니다다
: " " " " " :2021-11-5
" " " " : "2021-11-05

그래서 제가 작은 유틸리티를 써서YYYY-M-D로로 합니다.YYYY-MM-DD ㅇㅇㅇ.2021-1-1로로 합니다.2021-01-01:

const date = "2021-1-1"
const YYYY = date.split("-")[0];

    //convert M->MM i.e. 2->02
    const MM =
      date.split("-")[1].length == 1
        ? "0" + date.split("-")[1]
        : date.split("-")[1];

    //convert D->DD i.e. 2->02
    const DD =
      date.split("-")[2].length == 1
        ? "0" + date.split("-")[2]
        : date.split("-")[2];

    // YYYY-MM-DD
    const properDateString = `${YYYY + "-" + MM + "-" + DD}`;

    const dateObj = new Date(properDateString);

@nizantz가 말했듯이, Safari에서 Date.parse()를 사용하는 것은 나에게 효과가 없었습니다.조사 결과 File 객체의 lastDateModified 속성이 폐지되어 Safari에서 더 이상 지원되지 않는다는 것을 알게 되었습니다.File 객체의 last Modified 속성을 사용하면 문제가 해결되었습니다.온라인에서 나쁜 정보가 발견되면 당연히 싫어하죠.

이 투고에 투고해 주신 모든 분들께 감사드리며, 제가 이 문제에 대해 알아가는 데 필요한 길을 걸을 수 있도록 도와주셨습니다.이 정보가 없었더라면, 나는 아마도 내 근본적인 문제를 해결하지 못했을 것이다.아마도 이것은 나와 비슷한 상황에 있는 다른 누군가에게 도움이 될 것이다.

파티에 늦게 도착했지만, 이 경우 String()이 아닌 ES6 back 틱을 사용하여 cast를 입력하면 Safari와 iOS에서 이 문제가 발생하였습니다.

이는 '잘못된 날짜' 오류를 나타내고 있습니다.

const dateString = '2011-11-18';
const dateObj = new Date(`${dateString}`); 

하지만 이것은 효과가 있다.

const dateObj = new Date(String(dateString)); 

Safari에서도 같은 문제가 발생하여 웹페이지에 삽입하여 해결하였습니다.

 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 

당신 사건도 잘 되길 바랍니다.

감사해요.

이거 안 돼요.alert(new Date('2010-11-29'));safari는 날짜 형식을 처리하는 방법이 이상하거나 이상합니다.alert(new Date(String('2010-11-29')));이렇게 해봐.

(또는)

Moment js를 사용하면 문제가 해결되지만 ios 14 이후에는 사파리가 더 이상해집니다.

이 경보를 시도합니다(순간(String("2015-12-31 00:00:00")).;

모멘트 JS

'mm/dd/yyy' 형식을 사용합니다.예:- new Date('02/28/2015')모든 브라우저에서 잘 작동합니다.

이것은 최선의 해결책은 아니지만, 단순히 오류를 잡아 현재 날짜를 돌려보낼 뿐입니다.저는 개인적으로 Safari 문제를 해결하지 못하고 싶습니다.사용자가 표준이 아닌 브라우저를 사용하고 싶다면 별난 일을 감수해야 합니다.

function safeDate(dateString = "") {
  let date = new Date();
  try {
    if (Date.parse(dateString)) {
      date = new Date(Date.parse(dateString))
    }
  } catch (error) {
    // do nothing.
  }
  return date;
}

백엔드에서 ISO 날짜를 보내달라고 제안합니다.

언급URL : https://stackoverflow.com/questions/4310953/invalid-date-in-safari