2009-02-01 15 views
26

मैं एक परियोजना के लिए जावास्क्रिप्ट की तारीख का उपयोग कर रहा हूं, लेकिन आज देखा कि मेरा कोड जो पहले काम करता था अब सही तरीके से काम नहीं कर रहा है। उम्मीद के अनुसार फरवरी का उत्पादन करने के बजाय, नीचे दिया गया कोड मार्च का उत्पादन करता है।जावास्क्रिप्ट दिनांक: अगले महीने

मेरे कोड इस तरह दिखता है:

current = new Date(); 
current.setMonth(current.getMonth()+1); //If today is Jan, expect it to be Feb now 

इस कोड को आज तक हर रोज ऊपर काम किया। क्या यह जावास्क्रिप्ट बग है या क्या मैं इस बारे में गलत तरीके से जा रहा हूं?

+5

कल इस तरह से कर सकते हैं 1st फ़रवरी था ... – nickf

+9

मजाकिया, सवाल था 1 फरवरी को 00:03 बजे पूछा गया समय वह अपने प्रश्न के साथ समाप्त हुआ, यह पहले से ही "दिनांकित" था: पी –

उत्तर

38

आपको शायद यह पता चल जाएगा कि आप 31 फरवरी 200 9 को तारीख निर्धारित कर रहे हैं (यदि आज 31 जनवरी है) और जावास्क्रिप्ट स्वचालित रूप से मार्च के शुरुआती हिस्से में रोल करता है।

महीने के दिन की जांच करें, मुझे उम्मीद है कि यह 1, 2 या 3 हो। यदि यह एक महीने पहले जोड़े जैसा नहीं है, तो महीने में फिर से बदलाव होने तक एक दिन तक रोल करें।

इस तरह, "जनवरी का अंतिम दिन" दिन "फरवरी का अंतिम दिन" बन जाता है।

संपादित करें:

रोनाल्ड, अन्य उत्तर देने के लिए अपनी टिप्पणी के आधार पर, आप किनारे मामले व्यवहार को दूर करना चाह सकते हैं जैसे कि "क्या होता है जब मैं 30 फ़र, बनाने की कोशिश" या "क्या होता है जब मैं 200 9/13/07 (yyyy/mm/dd) बनाने का प्रयास करें "(कि अंतिम समाधान अभी भी मेरे समाधान के लिए एक समस्या हो सकती है, इसलिए आपको इसका परीक्षण करना चाहिए)।

इसके बजाय, मैं स्पष्ट रूप से संभावनाओं के लिए कोड करता हूं। जब से तुम महीने के दिन के बारे में परवाह नहीं है (आप बस वर्ष और माह चाहते अगले महीने के लिए सही होने के लिए), कुछ इस तरह पर्याप्त होना चाहिए:

var now = new Date(); 
if (now.getMonth() == 11) { 
    var current = new Date(now.getFullYear() + 1, 0, 1); 
} else { 
    var current = new Date(now.getFullYear(), now.getMonth() + 1, 1); 
} 

है कि आप जनवरी 1 के लिए अगले वर्ष देता है दिसंबर में किसी भी दिन और अगले महीने के पहले दिन किसी भी अन्य दिन के लिए। अधिक कोड, मुझे पता है, लेकिन मैं लंबे समय से दक्षता के लिए कोडिंग चाल से थक गया हूं, पठनीयता को पसंद करता हूं जब तक कि अन्यथा करने की स्पष्ट आवश्यकता न हो।

+0

बेशक, यह उल्लेखनीय है कि यह सब इस बात पर निर्भर करता है कि आपके कंप्यूटर की तिथि क्या निर्धारित है। यह शायद ही कभी सटीक है। –

+0

अच्छा एक, @ जोश :-) - मेरा सामान्य रूप से कुछ मिनटों से अधिक नहीं होता है। मैं किसी और के लिए झुकाव नहीं कर सकता। शायद मुझे पढ़ने के लिए जवाब समायोजित करना चाहिए "आपको महीने के पहले दिन ** ** आपके कंप्यूटर के बारे में सोचने वाला महीना ** ** – paxdiablo

+0

यह समाधान ज़ुलू समय के लिए काम नहीं कर सकता है। मेरी वृद्धि समय क्षेत्र diff द्वारा बंद है – Jess

25

यह आज़माएं:

var now = new Date(); 
current = new Date(now.getFullYear(), now.getMonth()+1, 1); 
+0

यदि मैं वर्तमान कोड करता हूं तो यह काम करता प्रतीत होता है .getMonth() + 1 आपके कोड का उपयोग करने के बाद। धन्यवाद! –

+0

ध्यान रखें कि यह महीने के दिन को 1 - क्या आप यही चाहते थे? – paxdiablo

+0

मैं बस इतना करना चाहता हूं कि अगले महीने से अगले महीने तक जाएं। मुझे दिनों की परवाह नहीं है, मुझे बस सही होने के लिए महीने की आवश्यकता है। –

4

आप date.js लाइब्रेरी का उपयोग कर सकते हैं:

http://code.google.com/p/datejs/

और सिर्फ इस

Date.today().next().month(); 

कर आप सही मूल्य होगा आज के लिए + 1 महीने (दिनों सहित)

+0

ग्रेट लाइब्रेरी वास्तव में साझा करने के लिए उपयोगी धन्यवाद! – talsibony

1

इस प्रयास करें:

var a = screen.Data.getFullYear(); 
var m = screen.Data.getMonth(); 
var d = screen.Data.getDate(); 

m = m + 1; 
screen.Data = new Date(a, m, d); 

if (screen.Data.getDate() != d) 
screen.Data = new Date(a, m + 1, 0); 
9

मैं एक सरल एक पंक्ति का समाधान गणित के माध्यम से अगले महीने पाने के लिए देख रहा था तो मैं ऊपर जावास्क्रिप्ट तारीख कार्य (मेरी ओर से मानसिक आलस्य) देखने के लिए नहीं होगा । काफी आश्चर्यजनक रूप से, मुझे यहां कोई नहीं मिला।

मैंने आलस्य के अपने संक्षिप्त झुकाव को पार कर लिया, एक लिखा, और साझा करने का फैसला किया!

समाधान:

(new Date().getMonth()+1)%12 + 1 

बस स्पष्ट कारण है कि इस काम करता है हो सकता है, मुझे नीचे जादू तोड़ दो!

यह चालू महीना (जो 0..11 प्रारूप में है), अगले महीने के लिए 1 की वृद्धि करता है, और इसे मॉड्यूलस के माध्यम से 12 की सीमा तक लपेटता है (11% 12 == 11; 12% 12 == 0)। यह अगले महीने उसी 0..11 प्रारूप में लौटाता है, इसलिए एक प्रारूप में कनवर्ट करना दिनांक() पहचान जाएगा (1..12) आसान है: बस 1 फिर से जोड़ें। अवधारणा के

सबूत:

> for(var m=0;m<=11;m++) { console.info("next month for %i: %i", m+1, (m+1)%12 + 1) } 
next month for 1: 2 
next month for 2: 3 
next month for 3: 4 
next month for 4: 5 
next month for 5: 6 
next month for 6: 7 
next month for 7: 8 
next month for 8: 9 
next month for 9: 10 
next month for 10: 11 
next month for 11: 12 
next month for 12: 1 
तो वहाँ तुम्हारे पास है

+0

यकीन नहीं है कि क्यों, लेकिन मैं इसे अगले महीने (नई तिथि() प्राप्त करने के लिए उपयोग करता हूं। GetMonth() + 1)% 12 + 23 –

+1

यह गणित है :-) –

0

आह, ternaries की सुंदरता:

const now = new Date(); 
const expiry = now.getMonth() == 11 ? new Date(now.getFullYear()+1, 0 , 1) : new Date(now.getFullYear(), now.getMonth() + 1, 1); 

सिर्फ @paxdiablo और @Tom

2

आप moment.js का उपयोग करते हैं द्वारा प्रदान समाधान का एक सरल संस्करण है, वे एक ऐड समारोह है। https://momentjs.com/docs/#/manipulating/add/

moment().add(7, 'months'); 

मैं भी महीने की एक चर संख्या जोड़ने के लिए paxdiablo के उत्तर के आधार पर एक पुनरावर्ती समारोह लिखा था - यहाँ लिंक है। डिफ़ॉल्ट रूप से यह फ़ंक्शन एक महीने को वर्तमान तिथि में जोड़ देगा।

function addMonths(after = 1, now = new Date()) { 
     var current; 
     if (now.getMonth() == 11) { 
      current = new Date(now.getFullYear() + 1, 0, 1); 
     } else { 
      current = new Date(now.getFullYear(), now.getMonth() + 1, 1);    
     } 
     return (after == 1) ? current : addMonths(after - 1, new Date(now.getFullYear(), now.getMonth() + 1, 1)) 
    } 

उदाहरण

console.log('Add 3 months to November', addMonths(3, new Date(2017, 10, 27))) 

आउटपुट -

Add 3 months to November Thu Feb 01 2018 00:00:00 GMT-0800 (Pacific Standard Time) 
0

आप शायद

var currentMonth = new Date().getMonth(); 

var monthNames = ["January", "February", "March", "April", "May", "June", 
    "July", "August", "September", "October", "November", "December" 
]; 

for(var i = currentMonth-1 ; i<= 4; i++){ 
console.log(monthNames[i])// make it as an array of objects here 

} 
संबंधित मुद्दे