2009-12-09 17 views
31

के माध्यम से जावास्क्रिप्ट दिनांक सी # # में मेरे पास जावास्क्रिप्ट दिनांक वस्तु है जो मुझे इस प्रारूप में दिनांक स्ट्रिंग देता है, "बुध दिसंबर 16 00:00:00 यूटीसी-0400 200 9"।अजाक्स

मैं सर्वर (ASP.NET सी #)

मैं कैसे परिवर्तित कर सकते हैं, "बुध दिसंबर 16 00:00:00 UTC-0400 2009" एक सी # समयदिनाँक वस्तु के लिए करने के लिए अजाक्स के माध्यम से इस गुजरती हैं। डेटटाइम। पर्स विफल रहता है।

उत्तर

52

आप जो आपको एक प्रारूप स्ट्रिंग पार्स के लिए प्रयोग की जाने वाली निर्दिष्ट कर सकते हैं DateTime.ParseExact उपयोग कर सकते हैं:

DateTime dt = DateTime.ParseExact("Wed Dec 16 00:00:00 UTC-0400 2009", 
            "ddd MMM d HH:mm:ss UTCzzzzz yyyy", 
            CultureInfo.InvariantCulture); 
+0

+1 मैं तुम्हें ऐसा कर सकता है एहसास नहीं था, बहुत शांत :) – Jay

+0

आप इसके बजाय डेटटाइम ऑफसेट का उपयोग करना चाह सकते हैं। – ColacX

0

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

उदाहरण के लिए आप जावास्क्रिप्ट में parse() का उपयोग कर सकते हैं जो दिनांक वस्तु का प्रतिनिधित्व करने वाले एमएस को वापस कर देगा, जिसे आप DateTime.Parse() का उपयोग C# DateTime ऑब्जेक्ट में कनवर्ट करने के लिए कर सकते हैं।

30

सबसे विश्वसनीय तरीका अवधि के बाद मिलीसेकेंड उपयोग करने के लिए किया जाएगा। Date.getTime() पर कॉल करके आप इसे आसानी से जावास्क्रिप्ट में प्राप्त कर सकते हैं। फिर, सी # में आप इसे इस प्रकार दिनांक समय में कन्वर्ट कर सकते हैं:

long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript 
return new DateTime(1970, 1, 1).AddTicks(msSinceEpoch * 10000); 

आप 10,000 से गुणा करने के लिए जो 100 नैनोसेकंड हैं मिलीसेकंड करने के लिए "टिक", से कन्वर्ट करना होगा।

+1

मुझे पता है कि यह एक पुराना, पुराना जवाब है लेकिन मेरे पास एक सवाल है।क्या डेटटाइम की'AddMilliseconds' विधि को कॉल करने के बजाय कोई नया टाइमस्पेन जोड़ने का कोई विशेष कारण है? – Joshua

+1

कोई कारण मुझे याद नहीं है। मैंने अब 'AddTicks' का उपयोग करने के लिए उत्तर संपादित किया है, जो शायद' AddMilliseconds 'से थोड़ा तेज़ है (हम यहां कुछ CPU चक्रों की बात कर रहे हैं)। – EMP

+1

मुझे उत्सुकता है कि क्यों "युग" 1 9 70/01/01 है। यह पता चला है कि यह "यूनिक्स युग" है। मैंने सोचा कि अगर मैं उत्सुक या उलझन में हूं तो मैं साझा करूंगा: http://en.wikipedia.org/wiki/Unix_time –

5

सिर्फ भविष्य के साथी Googlers की मदद करने के लिए, मैं ईएमपी के जवाब पर विस्तार करना चाहता हूं।

ईएमपी का जवाब यूटीसी में समय प्रदान करता है (यदि आप यही चाहते हैं, तो इसका उपयोग करें)।

सी # में ग्राहक स्थानीय समय पर पहुंचने के लिए:

जावास्क्रिप्ट में:

 var now = new Date(); 
     var UTC = now.getTime(); 
     var localOffset = (-1) * now.getTimezoneOffset() * 60000; 
     var currentTime = Math.round(new Date(UTC + localOffset).getTime()); 

सी # में:

 DateTime currentTimeDotNet = new DateTime(1970, 1, 1).AddTicks(Convert.ToInt64(currentTime) * 10000); 

क्रेडिट this blog करने और ईएमपी का जवाब है, लेकिन कुछ ले लिया परीक्षण करने के लिए दोनों सिरों पर परीक्षण और त्रुटि, तो भविष्य के लोगों के लिए बस fyi।

+0

यह सबसे सही उत्तर है समय-क्षेत्र समायोजन सही ढंग से संभालता है। –

22

यह आपके मामले में संभव नहीं हो सकता है, लेकिन मैं वास्तव में आईएसओ 8601 प्रारूप में दिनांक/समय पास करने के लिए जेएस कोड अपडेट करने की सलाह देता हूं। http://en.wikipedia.org/wiki/ISO_8601

आईएसओ 8601 न केवल औपचारिक मानक है, इसका उपयोग करना भी आसान है और बहुत समय-समय पर परेशानी को रोकता है!

जावास्क्रिप्ट में 8601 दिनांक तार पाने के लिए:

var d = new Date(); 
var iso_time = d.toISOString(); //"2014-05-06T18:49:16.029Z" 

सी # में 8601 दिनांक तार पढ़ने के लिए:

DateTime d = DateTime.Parse(json_string); 
+0

मैं इसे सबसे अच्छा दृष्टिकोण मानता हूं क्योंकि यह एक ही कदम है और टाइमज़ोन या सिस्टम को संभालने के लिए किसी अन्य हुप्स के माध्यम से कूदने की आवश्यकता नहीं है। डेटटाइम पार्सिंग। – zomf

+0

मैं इस दृष्टिकोण का उपयोग पलज –

+0

के अनुरूप करने के लिए कर रहा हूं यह उत्तर मेरे परिदृश्य के लिए पूरी तरह से काम करता है। – blfuentes