নতুন তারিখ () ক্রোমে কাজ করছে তবে ফায়ারফক্সে নয়


94

আমি একটি ডেটটাইম স্ট্রিং তৈরি করছি যা দেখতে এরকম দেখাচ্ছে: 2010-07-15 11:54:21

এবং নিম্নলিখিত কোড সহ আমি ফায়ারফক্সে অবৈধ তারিখ পাই তবে ক্রোমে ঠিক কাজ করে

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

ফায়ারফক্সে ডেট 1 আমাকে একটি অবৈধ তারিখ দিচ্ছে, তবে ক্রোমে এটির ঠিক কাজ করা মূল কারণটি কী হবে?



সমস্ত বাস্তবায়ন ECMA-262 এ বিন্যাসটিকে সমর্থন করে না তাই সর্বদা ম্যানুয়ালি স্ট্রিংগুলি বিশ্লেষণ করে (একটি গ্রন্থাগার সহায়তা করতে পারে তবে সম্ভবত একক ফর্ম্যাটগুলির জন্য প্রয়োজনীয় নয়)।
রবজি

এটি এখন ফায়ারফক্স কাজ করে।
এসএম ইয়ামশিতা

উত্তর:


80

আপনি যেভাবে চান কোনও তারিখের অবজেক্ট ইনস্ট্যান্ট করতে পারবেন না। এটি একটি নির্দিষ্ট উপায়ে হতে হবে। এখানে কিছু বৈধ উদাহরণ রয়েছে:

new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

বা

d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)

ক্রোম অবশ্যই আরও নমনীয় হতে হবে।

সূত্র: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / তারিখ

অ্যাপসিলারদের মন্তব্য থেকে :

EMCAScript স্পেসিফিকেশনটির জন্য ঠিক এক তারিখের ফর্ম্যাট প্রয়োজন (যেমন, YYYY-MM-DDTHH: মিমি: ss.sssZ) তবে কাস্টম ডেট ফর্ম্যাটগুলি একটি প্রয়োগের দ্বারা নির্দ্বিধায় সমর্থিত হতে পারে : " স্ট্রিং যদি [ECMAScript- সংজ্ঞায়িত] ফর্ম্যাটের সাথে সম্মতি না দেয় তবে ফাংশনটি কোনও বাস্তবায়ন-নির্দিষ্ট হিউরিস্টিকস বা বাস্তবায়ন-নির্দিষ্ট তারিখের ফর্ম্যাটগুলিতে ফিরে যেতে পারে "" ক্রোম এবং এফএফ কেবল আলাদা আলাদা "প্রয়োগ-নির্দিষ্ট তারিখের ফর্ম্যাট থাকে।"


4
আমি একটি সমাধান পেয়েছি যা ফায়ারফক্স সহ সমস্ত ব্রাউজারগুলিতে কাজ করে: stackoverflow.com/a/21984717/586051
রাহুল দেশাই

7
এই ব্রাউজারের পার্থক্যটি কেন বিদ্যমান: EMCAScript নির্দিষ্টকরণের জন্য ঠিক এক তারিখের ফর্ম্যাট প্রয়োজন (যেমন,YYYY-MM-DDTHH:mm:ss.sssZ ) প্রয়োজন তবে কাস্টম তারিখের ফর্ম্যাটগুলি একটি প্রয়োগের মাধ্যমে নির্দ্বিধায় সমর্থিত হতে পারে : " স্ট্রিং যদি [ECMAScript- সংজ্ঞায়িত] ফর্ম্যাটের সাথে সম্মতি না দেয় তবে ফাংশনটি হতে পারে কোনও প্রয়োগ-নির্দিষ্ট হিউরিস্টিকস বা বাস্তবায়ন-নির্দিষ্ট তারিখের ফর্ম্যাটগুলিতে ফিরে যান back "ক্রোম এবং এফএফের মধ্যে কেবল" প্রয়োগ-নির্দিষ্ট তারিখের ফর্ম্যাট থাকে ""
অ্যাপসিলার

তারিখ বিন্যাসের একটি উদাহরণ (মাসটিতে "" অন্তর্ভুক্ত রয়েছে) যা ক্রোমে কাজ করে তবে ফায়ারফক্সে নয়: 'ফেব্রুয়ারি। 14, 2019 '

এটি কেবলমাত্র ফায়ারফক্সে আমার পক্ষে কাজ করেছিল যদি আমি 'মিলিসেকেন্ডগুলিতে যুক্ত করি Date('milliseconds')অন্যথায় আমি বলছিলাম যে মিলিসেকেন্ডগুলি সংজ্ঞায়িত করা হয়নি তবে এটি কমপক্ষে কাজ করেছে, যেখানে অন্যান্য অনেকগুলি ট্রায়াল ব্যর্থ হয়েছিল an এটি ক্রোমে এখনও খুশি মনে হচ্ছে।
স্টিভ 18

25

এটি সমস্ত ব্রাউজারে কাজ করে -

নতুন তারিখ ('2001/01/31 12:00:00 এএম')

new Date('2001-01-31 12:00:00')

ফর্ম্যাট: YYYY-MM-DDTHH: মিমি: এসএসএসএস

বিশদ: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.155


কারণ আমরা সবাই জানি এটি একটি আন্তর্জাতিক মানের। w3.org/ আন্তঃরাষ্ট্রীয়
ববি টেবিল

6
সুতরাং আপনি আসলে সমস্ত ব্রাউজার পরীক্ষা করেছেন ? এবং অনুমান করে যে আপনার কাছে, ভবিষ্যতে সমস্ত ব্রাউজারগুলিও (অ-মানক) ফর্ম্যাটটিকে সমর্থন করবে?
রবজি

4
এটি আমার পক্ষে কাজ করে। সুতরাং আপনি যদি ইতিমধ্যে '2001-1-31 12:00:00' এর একটি স্ট্রিং পেয়ে থাকেন তবে আমরা সহজভাবে এটি করতে পারি: নতুন তারিখ (স্ট্রিংরেজ (/ - / জি, '/'));
জিয়ানওয়ু চেন

@ জিয়ানউউচেন আপনি ইচ্ছাকৃতভাবে একটি মান বিন্যাসকে অ-মানক হিসাবে পরিবর্তন করছেন। ভালো বুদ্ধি নই.
জেজেজে

4
3 বছর পরে, এটি এজ এবং উইন্ডো সাফারিটিতে কাজ করছে না।
এমজি থার

14

বিকল্প 1 :

মনে করুন আপনার টাইমস্ট্রিংয়ের এমন বিন্যাস রয়েছে যা দেখতে দেখতে:

'2016-03-10 16:00:00.0'

সেক্ষেত্রে আপনি এটিকে রূপান্তর করতে একটি সাধারণ রেজেক্স করতে পারেন ISO 8601:

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

এটি নিম্নলিখিত আউটপুট সংগ্রহ করতে হবে:

'2016-03-10T16:00:00.0'

এটি স্ট্যান্ডার্ড ডেটটাইম ফর্ম্যাট এবং এটি সমস্ত ব্রাউজার দ্বারা সমর্থিত:

document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE

বিকল্প 2:

মনে করুন আপনার টাইমস্ট্রিংয়ের এমন বিন্যাস রয়েছে যা দেখতে দেখতে:

'02-24-2015 09:22:21 PM'

এখানে, আপনি নীচের রেজেক্স করতে পারেন:

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

এটিও সমস্ত ব্রাউজার দ্বারা সমর্থিত একটি ফর্ম্যাট তৈরি করে:

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE

বিকল্প 3:

ধরুন আপনার কাছে এমন একটি টাইম স্ট্রিং রয়েছে যা ভাল-সমর্থিত মানগুলির একটিতে সামঞ্জস্য করা সহজ নয়।

সেক্ষেত্রে আপনার সময়ের স্ট্রিংটিকে কেবল বিভিন্ন টুকরো টুকরো করে ভাগ করা এবং এটির জন্য পৃথক পরামিতি হিসাবে ব্যবহার করা ভাল Date:

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE


4
var d = নতুন তারিখ ('2017-08-28 08:02 অপরাহ্ন'। রিপ্লেস (/ - / জি, '/')); এটি আমার জন্য ক্রোমের পাশাপাশি মোজিলায় পুরোপুরি কাজ করে।
রাহুল মানকর

13

এটি বেশিরভাগ ব্রাউজারেও কাজ করে

new Date('2001/01/31 12:00:00')

এটি ফর্ম্যাট

"yyyy/MM/dd HH:mm:ss"

4
কোনও ব্রাউজারে ফর্ম্যাটটি কাজ করবে এমন কোনও গ্যারান্টি নেই, "কম সবই"।
রবজি

আপনি যে সম্পর্কে সঠিক, উত্তর আমার অভিজ্ঞতার উপর ভিত্তি করে।
অ্যালভিস

8

আপনি যদি এখনও ড্যাশ ব্যবহার করে তারিখ তৈরি করতে চান তবে আপনি এই ফর্ম্যাটটি ব্যবহার করতে পারেন:

var date = new Date('2013-08-31T17:00:00Z')

তবে মনে রাখবেন যে এটি ইউটিসি অনুসারে সময় তৈরি করে। অর্থ, আপনি যদি GMT + 3 (GMT এর 3 ঘন্টা এগিয়ে) টাইমজোনে বাস করেন তবে এটি টাইমজোনটি অফসেটটিকে সময়ের সাথে যুক্ত করবে। GMT + 3 হলে উপরের উদাহরণটির এই মানটি থাকবে (দ্রষ্টব্য যে এটি 20:00 ঘন্টা এবং 17:00 নয়):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

শেষে 'জেড' পত্র যুক্ত করার বিষয়ে নিশ্চিত হন, কারণ অন্যথায় ক্রোম এবং ফায়ারফক্স স্ট্রিংটিকে আলাদাভাবে পার্স করবে (একটি সময় অফসেট যুক্ত করবে এবং অন্যটি তা করবে না)।


4
হ্যাঁ ক্রোম এবং ফায়ারফক্স আপনি টাইমজোন সরবরাহ না করলে আলাদা আচরণ করে। এবং, আগ্রহের বাইরে আমি মনে করি ফায়ারফক্স এটি ভুল করে। সময় অঞ্চল অনুপস্থিত থাকলে এটি GMT ধরে নেওয়া উচিত। ক্রোম করে, ফায়ারফক্স দেয় না। ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
জুলিয়ান

@ জুলিয়ান জেল্ফস- " কেবলমাত্র তারিখের জন্য টাইমজোন অনুপস্থিত থাকলে এটি GMT ধরে নেওয়া উচিত " (আইএসও 8601 এর বিপরীতে)। তারিখ এবং সময়ের স্ট্রিংগুলির জন্য, এটি স্থানীয় ধরে নেওয়া উচিত (আইএসও 8601 এর সাথে সামঞ্জস্যপূর্ণ)। তবে যে কোনও ক্ষেত্রে ম্যানুয়াল পার্সিংই একমাত্র নিরাপদ উপায়।
রবজি

5

অ্যাংুলারজেএস-এর সাথে কাজ করার সময় ফায়ারফক্স এবং সাফারি উভয় ক্ষেত্রেই আমার একই রকম সমস্যা ছিল। উদাহরণস্বরূপ, যদি কৌণিক থেকে কোনও তারিখ ফিরে আসে তবে:

2014-06-02 10:28:00

এই কোড ব্যবহার:

new Date('2014-06-02 10:28:00').toISOString();

ফায়ারফক্স এবং সাফারিতে একটি অবৈধ তারিখ ত্রুটি প্রদান করে। তবে ক্রোমে এটি সূক্ষ্মভাবে কাজ করে। অন্য একটি উত্তর হিসাবে বলা হয়েছে, ক্রোম সম্ভবত তারিখের স্ট্রিংগুলি পার্সিংয়ের সাথে আরও বেশি নমনীয়।

আমার শেষ লক্ষ্যটি ছিল একটি নির্দিষ্ট উপায়ে তারিখটি ফর্ম্যাট করা। আমি একটি দুর্দান্ত লাইব্রেরি পেয়েছি যা ক্রস ব্রাউজারের সামঞ্জস্যতা সমস্যা এবং তারিখের ফর্ম্যাটিং ইস্যু উভয়ই পরিচালনা করে। লাইব্রেরি বলা হয় moment.js হয়

এই লাইব্রেরিটি ব্যবহার করে নীচের কোডটি আমি পরীক্ষিত সমস্ত ব্রাউজারগুলিতে সঠিকভাবে কাজ করে:

moment('2014-06-02 10:28:00').format('MMM d YY')

আপনি যদি এই অতিরিক্ত লাইব্রেরিকে আপনার অ্যাপ্লিকেশনটিতে অন্তর্ভুক্ত করতে ইচ্ছুক হন তবে সম্ভাব্য ব্রাউজারের সামঞ্জস্যের সমস্যাগুলি এড়িয়ে গিয়ে আপনি খুব সহজেই আপনার তারিখের স্ট্রিং তৈরি করতে পারেন। বোনাস হিসাবে আপনার প্রয়োজনে সহজেই ফর্ম্যাট, অ্যাড, বিয়োগ, ইত্যাদি তারিখের একটি ভাল উপায় থাকবে।


স্ট্রিংগুলি পার্স করার সময় আপনার সর্বদা মুহূর্তের মুহুর্তে ফাংশনটি পাস করা উচিত otherwise
রবজি

4

এটি আপনার পক্ষে কাজ করা উচিত:

var date1 = new Date(year, month, day, hour, minute, seconds);

আমাকে একটি স্ট্রিং ফর্ম তৈরি করতে হয়েছিল তাই আমি এটি এটির মতো করেছিলাম:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

মনে রাখবেন যে জাভাস্ক্রিপ্টে মাসগুলি 0 থেকে 11 পর্যন্ত হয়, সুতরাং আপনার এই মাসের মান 1 দ্বারা হ্রাস করা উচিত:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

2

সাধারণ সমাধান, এটি সমস্ত ব্রাউজারের সাথে কাজ করে,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);

1

মিলিসেকেন্ডের সাথে ডিল করার সময় আমি যে পরিস্থিতিটির মধ্যে পড়েছিলাম was নতুন তারিখ তৈরি করার চেষ্টা করার সময় এফএফ এবং আইই এই তারিখের স্ট্রিংটিকে সঠিকভাবে বিশ্লেষণ করবে না। "2014/11/24 17:38:20.177Z" তারা কীভাবে পরিচালনা করতে জানে না .177Z। ক্রোম যদিও কাজ করবে।


1

এটিই আমার পক্ষে কাজ করেছে Firefoxএবং Chrome:

// The format is 'year-month-date hr:mins:seconds.milliseconds'
const d = new Date('2020-1-4 12:00:00.999') 
// we use the `.` separator between seconds and milliseconds.

শুভকামনা ...


0

আসলে ক্রোম বিভিন্ন স্ট্রিং বিন্যাসের সাথে ডিল করতে আরও নমনীয়। এমনকি যদি আপনি এর স্ট্রিং ফর্ম্যাটটি নাও সনাক্ত করেন তবে ক্রোম ত্রুটি ছাড়াই স্ট্রিংকে তারিখে রূপান্তর করতে পারে। এটার মত:

  var outputDate = new Date(Date.parse(inputString));

তবে ফায়ারফক্স এবং সাফারির জন্য জিনিসগুলি আরও জটিল হয়ে ওঠে। প্রকৃতপক্ষে, ফায়ারফক্সের নথিতে এটি ইতিমধ্যে বলেছে: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / তারিখ / পার্স )

কোনও আরএফসি 2822 বা আইএসও 8601 তারিখের প্রতিনিধিত্বকারী একটি স্ট্রিং (অন্যান্য ফর্ম্যাটগুলি ব্যবহার করা যেতে পারে, তবে ফলাফলগুলি অপ্রত্যাশিত হতে পারে)।

সুতরাং, আপনি যখন ফায়ারফক্স এবং সাফারিতে ডেট . পার্স ব্যবহার করতে চান , আপনার সাবধান হওয়া উচিত। আমার জন্য, আমি এটি মোকাবেলায় একটি কৌশল কৌশল ব্যবহার করি। (দ্রষ্টব্য: এটি সব ক্ষেত্রে সঠিক হতে পারে না)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

এখানে এটি 2013-08-08 11:52:18 ইউটিসি থেকে 2013-08-08T11: 52: 18Z প্রথমে রূপান্তরিত হয় এবং তার ফর্ম্যাটটি ফায়ারফক্সের নথিতে উপযুক্ত শব্দ। এই সময়ে, তারিখ.পার্স যে কোনও ব্রাউজারে সর্বদা ঠিক থাকবে।


0

সম্ভাব্য তারিখের স্ট্রিংগুলি সংজ্ঞায়িত করার জন্য একটি ডব্লিউ 3 সি রয়েছে যা কোনও ব্রাউজার (ফায়ারফক্স এবং সাফারি সহ) দ্বারা পার্সেবল হওয়া উচিত:

Year:
   YYYY (e.g., 1997)
Year and month:
   YYYY-MM (e.g., 1997-07)
Complete date:
   YYYY-MM-DD (e.g., 1997-07-16)
Complete date plus hours and minutes:
   YYYY-MM-DDThh:mmTZD (e.g., 1997-07-16T19:20+01:00)
Complete date plus hours, minutes and seconds:
   YYYY-MM-DDThh:mm:ssTZD (e.g., 1997-07-16T19:20:30+01:00)
Complete date plus hours, minutes, seconds and a decimal fraction of a
second
   YYYY-MM-DDThh:mm:ss.sTZD (e.g., 1997-07-16T19:20:30.45+01:00)

কোথায়

YYYY = four-digit year
MM   = two-digit month (01=January, etc.)
DD   = two-digit day of month (01 through 31)
hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
mm   = two digits of minute (00 through 59)
ss   = two digits of second (00 through 59)
s    = one or more digits representing a decimal fraction of a second
TZD  = time zone designator (Z or +hh:mm or -hh:mm)

মতে YYYY-MM-DDThh:mmTZD, উদাহরণটি 2010-07-15 11:54:21হয় 2010-07-15T11:54:21Zবা কোনও 2010-07-15T11:54:21+02:00(বা অন্য কোনও টাইমজোন সহ) রূপান্তর করতে হবে ।

প্রতিটি বৈকল্পিকের ফলাফলগুলি দেখানোর জন্য এখানে একটি সংক্ষিপ্ত উদাহরণ দেওয়া হল:

const oldDateString = '2010-07-15 11:54:21'
const newDateStringWithoutTZD = '2010-07-15T11:54:21Z'
const newDateStringWithTZD = '2010-07-15T11:54:21+02:00'
document.getElementById('oldDateString').innerHTML = (new Date(oldDateString)).toString()
document.getElementById('newDateStringWithoutTZD').innerHTML = (new Date(newDateStringWithoutTZD)).toString()
document.getElementById('newDateStringWithTZD').innerHTML = (new Date(newDateStringWithTZD)).toString()
div {
  padding: 10px;
}
<div>
  <strong>Old Date String</strong>
  <br>
  <span id="oldDateString"></span>
</div>
<div>
  <strong>New Date String (without Timezone)</strong>
  <br>
  <span id="newDateStringWithoutTZD"></span>
</div>
<div>
  <strong>New Date String (with Timezone)</strong>
  <br>
  <span id="newDateStringWithTZD"></span>
</div>


-1

ফায়ারফক্সে, কোনও অবৈধ তারিখ তারিখ হিসাবে তারিখের অবজেক্ট হিসাবে ফিরে আসে 1899-11-29T19:00:00.000Z, সুতরাং ব্রাউজারটি ফায়ারফক্স কিনা তা পরীক্ষা করে তার তারিখের স্ট্রিংয়ের অবজেক্ট পান "1899-11-29T19:00:00.000Z".getDate()। শেষ পর্যন্ত তারিখের সাথে এটি তুলনা করুন।


এটি সমস্যার কারণ ব্যাখ্যা করে না বরং সমস্যার পরিণতি কী হবে তা ব্যাখ্যা করে।
রাইটিস

-1

আমি নিম্নলিখিত তারিখের ফর্ম্যাটটি ব্যবহার করেছি এবং এটি সমস্ত ব্রাউজারে কাজ করছে।

var target_date = new Date("Jul 17, 2015 16:55:22").getTime();

var days, hours, minutes, seconds;

var countdown = document.getElementById("countdown");

remaining = setInterval(function () {

    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date) / 1000;
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
    countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
        + minutes + " minute, " + seconds + " second.</b>";  
}, 1000);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.