سؤال

لماذا يُرجع جافا سكريبت هذا الرقم 108 بدلاً من 2008؟هل يحصل على اليوم والشهر الصحيح ولكن ليس السنة؟

myDate = new Date();
year = myDate.getYear();

السنة = 108؟

هل كانت مفيدة؟

المحلول

انه Y2K الشيء، يتم احتساب السنوات منذ عام 1900 فقط.

هناك مشكلات توافق محتملة الآن getYear() تم إهمالها لصالح getFullYear() - من وضع المراوغات:

ولجعل الأمر أكثر تعقيدًا، تم إهمال date.getYear() في الوقت الحاضر ويجب عليك استخدام date.getFullYear()، والذي بدوره غير مدعوم من قبل المتصفحات القديمة.إذا كان يعمل، ومع ذلك، ينبغي أن يعطي دائما سنة كاملة، أي.2000 بدلا من 100.

متصفحك يعطي السنوات التالية بهاتين الطريقتين:

* The year according to getYear(): 108
* The year according to getFullYear(): 2008

هناك أيضًا اختلافات في التنفيذ بين Internet Explorer وFirefox، كما هو الحال في تطبيق IE getYear() تم تغييره ليتصرف مثل getFullYear() - من آي بي إم:

وفقًا لمواصفات ECMAScript، تقوم getYear بإرجاع السنة ناقص 1900، وكان المقصود منها في الأصل إرجاع "98" لعام 1998.تم إهمال getYear في الإصدار 3 من ECMAScript واستبداله بـ getFullYear().

قام Internet Explorer بتغيير getYear() ليعمل مثل getFullYear() وجعله متوافقًا مع Y2k، بينما احتفظت Mozilla بالسلوك القياسي.

نصائح أخرى

نظرًا لأن getFullYear لا يعمل في المتصفحات القديمة، يمكنك استخدام شيء مثل هذا:

Date.prototype.getRealYear = function() 
{ 
    if(this.getFullYear)
        return this.getFullYear();
    else
        return this.getYear() + 1900; 
};

يمكن استخدام نموذج جافا سكريبت لتوسيع الكائنات الموجودة، تمامًا مثل طرق تمديد C#.الآن، يمكننا أن نفعل هذا؛

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008

تحقق من المستندات.إنها ليست مشكلة عام 2000 - إنها عدم وجود مشكلة عام 2000!تم اتخاذ هذا القرار في الأصل بلغة C وتم نسخه إلى لغة Perl، وعلى ما يبدو إلى JavaScript، وربما إلى عدة لغات أخرى.منذ فترة طويلة، كان من الواضح أنه لا يزال من المرغوب فيه استخدام السنوات المكونة من رقمين، ولكن من اللافت للنظر أن كل من صمم تلك الواجهة كان لديه ما يكفي من التفكير المدروس لإدراك أنه بحاجة إلى التفكير فيما سيحدث في عام 2000 وما بعده، لذلك بدلاً من مجرد توفير الرقمين الأخيرين أرقام، فهي توفر عدد السنوات منذ عام 1900.يمكنك استخدام الرقمين، إذا كنت في عجلة من أمرك أو تريد المخاطرة.أو إذا أردت أن يستمر برنامجك في العمل، يمكنك إضافة 100 إلى النتيجة واستخدام سنوات كاملة مكونة من أربعة أرقام.

أتذكر المرة الأولى التي قمت فيها بالتلاعب بالتاريخ في لغة بيرل.والغريب أنني قراءة المستندات.يبدو أن هذا ليس بالأمر الشائع.وبعد مرور عام أو عامين، تم استدعائي إلى المكتب في 31 ديسمبر 1999 لإصلاح خطأ تم اكتشافه في آخر لحظة ممكنة في أحد أكواد عقد Perl، وهي أشياء لم يكن لي أي علاقة بها على الإطلاق.وكانت هذه القضية بالضبط:يُرجع استدعاء التاريخ القياسي السنوات منذ عام 1900، ويعاملها المبرمجون على أنها سنة مكونة من رقمين.(لقد افترضوا أنهم سيحصلون على "00" في عام 2000.) باعتباري مبرمجًا شابًا عديم الخبرة، أذهلني أننا دفعنا مبلغًا إضافيًا مقابل وظيفة "احترافية"، ولم يكلف هؤلاء الأشخاص أنفسهم حتى عناء قراءة الكتاب. توثيق.لقد كانت بداية سنوات عديدة من خيبة الأمل.الآن أنا عجوز وساخر.:)

في عام 2000، تمت الإشارة إلى مؤتمر YAPC Perl السنوي باسم "YAPC 19100" تكريمًا لهذا الخطأ الذي تم الإبلاغ عنه كثيرًا.

في الوقت الحاضر، في عالم لغة Perl على الأقل، من المنطقي استخدام وحدة قياسية لمعالجة التاريخ، وحدة تستخدم سنوات حقيقية مكونة من أربعة أرقام.لست متأكدًا مما قد يكون متاحًا لجافا سكريبت.

يجب أن يُرجع عدد السنوات منذ عام 1900.

يستخدم date.getFullYear().

هذا (كما تمت الإشارة إليه بشكل صحيح في مكان آخر) هو أمر يتعلق بعام 2000.على سبيل المثال، تم إرجاع Netscape (المكتوب قبل عام 2000) في الأصل 98 من getYear().بدلا من العودة إلى 00, ، بل عاد بدلاً من ذلك 100 لعام 2000.ثم جاءت المتصفحات الأخرى وفعلت ذلك بشكل مختلف، وكان الجميع غير راضين عن عدم التوافق.

المتصفحات اللاحقة مدعومة getFullYear كطريقة قياسية لإرجاع السنة كاملة.

هذا السؤال قديم جدًا لدرجة أنه يجعلني أبكي من الحنين إلى أيام الدوت كوم!

هذا صحيح، تقوم الدالة Date.getYear()‎ بإرجاع عدد السنوات منذ عام 1900، تمامًا مثل التوقيت المحلي الخاص بـ Perl().يتساءل المرء لماذا لا تأخذ لغة مصممة في التسعينيات في الاعتبار دوران القرن، ولكن ماذا يمكنني أن أقول؟كان عليك ان تكون هناك.لقد كان الأمر منطقيًا نوعًا ما في ذلك الوقت (مثلما فعل موقع Pets.com).

قبل عام 2000، ربما كان المرء يميل إلى إصلاح هذا الخطأ عن طريق إلحاق "19" بنتيجة getYear() مما أدى إلى "خطأ عام 19100".لقد أجاب الآخرون بالفعل على هذا السؤال بشكل كافٍ (أضف 1900 إلى نتيجة getDate()).

ربما يكون الكتاب الذي تقرأه عن JavaScript قديمًا بعض الشيء؟

شكرا على تفهمك ما سبق!

يجب عليك، كما أشير، أن لا تستخدمه أبدًا getYear(), ، ولكن بدلا من ذلك استخدم getFullYear().

ومع ذلك، فإن القصة ليست بسيطة مثل "تطبيقات IE GetYear() مثل getFullYear().أوبرا وIE علاج هذه الأيام getYear() مثل getYear() تم تحديده في الأصل للتواريخ قبل عام 2000، ولكن سيتم التعامل معه على أنه getFullYear() للتواريخ بعد عام 2000، بينما يلتزم كل من webkit وFirefox بالسلوك القديم

يؤدي هذا إلى إخراج 99 في جميع المتصفحات:

javascript:alert(new Date(917823600000).getYear());

يؤدي هذا إلى إخراج 108 في FF/WebKit، و2008 في Opera/IE:

javascript:alert(new Date().getYear());

انها غبية.هو - هي التواريخ إلى أيام ما قبل Y2K, ، والآن يُرجع فقط عدد السنوات منذ 1900 لأسباب تتعلق بالإرث.استخدم getFullYear() للحصول على السنة الفعلية.

انا استخدم date.getUTCFullYear();العمل دون مشاكل.

الرقم الذي تحصل عليه هو عدد السنوات منذ عام 1900.لا تسألني لماذا ..

وكما قال آخرون، فهو يُرجع عدد السنوات منذ عام 1900.السبب وراء ذلك الذي - التي هو أنه عندما تم اختراع JavaScript في منتصف التسعينيات، كان هذا السلوك مناسبًا ومتسقًا مع واجهات برمجة التطبيقات الخاصة بالتاريخ والوقت في اللغات الأخرى.وخاصة ج.وبالطبع، بمجرد إنشاء واجهة برمجة التطبيقات (API)، لم يتمكنوا من تغييرها لأسباب تتعلق بالتوافق مع الإصدارات السابقة.

راجع للشغل، قد تعرض المتصفحات المختلفة نتائج مختلفة، لذلك من الأفضل تخطي هذه الوظيفة تمامًا واستخدام getFullYear() دائمًا.

var date_object=new Date();var year = date_object.getYear();if (year <2000) {year = year + 1900 ؛} // سوف تحصل على السنة الكاملة ....

إنها تعود بالعام المكون من 4 أرقام - 1900، والذي ربما كان رائعًا منذ أكثر من 9 سنوات، ولكنه متخلف جدًا الآن.يقوم Java.util.Date الخاص بـ Java بذلك أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top