Excel दिनांक कोड को "दिनांक" में कनवर्ट करें


15

एक गैर-नकारात्मक पूर्णांक एक्सेल-शैली दिनांक कोड को देखते हुए, किसी भी उचित रूप में संबंधित "तिथि" लौटाएं जो स्पष्ट रूप से वर्ष, माह और "दिन" दिखाता है।

तुच्छ, आप सोच सकते हैं। क्या आपने "डराने वाले उद्धरण" को नोटिस किया था? मैंने उन का उपयोग किया क्योंकि एक्सेल में कुछ विचित्रताएं हैं। एक्सेल जनवरी 1 के लिए नंबर 1 के साथ दिन में गिना जाता है सेंट , 1900 है, लेकिन के रूप में अगर 1900 एक जनवरी 0 पड़ा वें और एक 29 फरवरी वें , इसलिए सभी प्रकार के परीक्षण की कोशिश करने का बहुत सावधान रहना होगा:

 Input → Output (example format)
     0 → 1900-01-00    Note: NOT 1899-12-31
     1 → 1900-01-01
     2 → 1900-01-02
    59 → 1900-02-28
    60 → 1900-02-29    Note: NOT 1900-03-01
    61 → 1900-03-01
   100 → 1900-04-09
  1000 → 1902-09-26
 10000 → 1927-05-18
100000 → 2173-10-14

1
क्या हर साल जनवरी की एक तारीख और फरवरी की २ ९ तारीख होती है या १ ९ ०० ही एकमात्र विसंगति है?
झबरा

4
1900 विसंगति है। एक्सेल 1900 को छोड़कर सही तरीके से लीप वर्ष का इलाज करता है (जो लीप वर्ष नहीं है)। लेकिन यह लोटस 1-2-3 के साथ संगतता के लिए था, जहां बग की उत्पत्ति हुई थी।
रिक हिचकॉक

3
@ रिकहॉककॉक जाहिर तौर पर, लोटस 1-2-3 देवों ने इसे लीप ईयर कोड पर बचाने के लिए किया, जैसे कि नियम हर चौथे साल में बन जाता है। अच्छे कारण के साथ भी; 1900 अतीत में बहुत दूर था, और 2100, ठीक है, थोड़ी देर में।
अड्म

3
@RickHitchcock यह बहुत अच्छी तरह से हो सकता है कि मूल लोटस 1-2-3 Y2K को संभाल नहीं सकता है, और इसलिए Microsoft ने उस एक मुद्दे की नकल करने का फैसला किया, लेकिन अन्यथा सही रहें। Btw, विरासत पर रहता है: .NET के OADATE में 1899-12- 30 का युग है, ताकि यह एक्सेल के साथ-साथ 1900 के पहले दो महीनों तक चलेगा, हालांकि इस DayOfWeekपद्धति की आवश्यकता है क्योंकि मूल युग, 1899-12-30 (या काल्पनिक 1900-01-00) को इस तरह चुना गया कि सप्ताह का दिन बस दिन की संख्या का मॉड -7 था, लेकिन यह 1899-12-30 के साथ काम नहीं करेगा।
एडम नो

4
यहां एक्सेल तारीखों के बारे में "क्यों" के पीछे की कहानी है: सॉफ्टवेयर पर जोएल: मेरा पहला बिलजी समीक्षा । जानकारीपूर्ण (और मनोरंजक) पढ़ा।
ब्रैडेक

जवाबों:


14

एक्सेल, 3 (+7?)

=A1

प्रारूप के साथ

yyy/m/d

शुद्ध बंदरगाह


आउटपुट फॉर्मेट आपके लोकेल के अनुसार अलग-अलग हो सकता है।
एडम

2
यह केवल विंडोज के लिए एक्सेल पर काम करता है। एक मैक के लिए एक्सेल में एक नंबर सिस्टम होता है जो 1904 में तारीखों से शुरू होता है, 1900 में नहीं। यह 1900 में किसी भी वर्ष की तारीख की रिपोर्ट नहीं करेगा, जो परीक्षण मामलों का हिस्सा हैं। आप यह निर्दिष्ट करना चाह सकते हैं कि यह विंडोज के लिए एक्सेल है।
कीता -

1
@Keeta मैक के लिए एक्सेल पर काम करने के लिए, वरीयताओं में "1904 तारीख प्रणाली का उपयोग करें" को अनचेक करें ।
ब्रैडेक

1
@BradC हालांकि सच है, किसी प्रोग्राम के डिफ़ॉल्ट कॉन्फ़िगरेशन में कोई भी बदलाव पूरी तरह से ठीक है लेकिन उत्तर में शामिल होना चाहिए। मैं इसे उत्तर को बेहतर बनाने के बिंदु के रूप में टिप्पणी करता हूं। मैं कहूंगा कि या तो विंडोज के लिए एक्सेल में इसका नाम स्विच करें, कैविएट जोड़ें, या ओपनऑफ़िस कैल्क (या समान) पर स्विच करें, क्योंकि वे उद्देश्यपूर्ण रूप से बग भी शामिल करते हैं)। codegolf.meta.stackexchange.com/questions/10037/…
कीता - मोनिका

6

k (kdb + 3.5), 55 54 51 50 बाइट्स

{$(`1900.01.00`1900.02.29,"d"$x-36526-x<60)0 60?x}

परीक्षण करने के लिए इस लाइन को q कंसोल में पेस्ट करें:

k)-1@{$(`1900.01.00`1900.02.29,"d"$x-36526-x<60)0 60?x}'0 1 2 59 60 61 100 1000 10000 100000;

आउटपुट होना चाहिए

1900.01.00
1900.01.01
1900.01.02
1900.02.28
1900.02.29
1900.03.01
1900.04.09
1902.09.26
1927.05.18
2173.10.14

{ } तर्क के साथ एक समारोह है x

0 60?xनहीं मिला तो 2 या के xबीच का सूचकांक0 60

ˋ1900.01.00ˋ1900.02.29 दो प्रतीकों की एक सूची

, इसे संलग्न करें

"d"$ एक तारीख में परिवर्तित

x-36526 1900 के बाद से दिनों की संख्या (डिफ़ॉल्ट 2000 के बजाय)

- x<60 एक्सेल की छलांग त्रुटि के लिए समायोजित करें

(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)@ 0 60?xjuxtaposition का अर्थ है अनुक्रमण - बीच में "@" निहित है

$ स्ट्रिंग में परिवर्तित करें


1
K (k5 / k6, मुझे लगता है) के एक अलग संस्करण के {$[x;$`d$x-65746;"1900.01.00"]} लिए, काम करने लगता है । मैं कुछ overflows कहीं के लिए मान 100000
zgrep 12

@zgrep आपको K के संस्करणों के बाद से पोस्ट करना चाहिए, जो मूल रूप से पूरी तरह से भिन्न भाषाएं हैं।
16

3

पायथन 2 , 111 बाइट्स

from datetime import*
n=input()
print('1900-0'+'12--0209'[n>9::2],date(1900,1,1)+timedelta(n+~(n>59)))[0<n!=60]

इसे ऑनलाइन आज़माएं!

-5 ngn के लिए धन्यवाद ।


नोट: मुझे पूरा यकीन है कि यह लंबोदर जितना लंबा होगा, क्योंकि परिणाम का प्रारूप अलग-अलग नहीं होना चाहिए।
५g

3

जावास्क्रिप्ट (ईएस 6),  89 82  77 बाइट्स

सहेजी गयी  7  12 @tsh करने के लिए धन्यवाद बाइट्स

n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')

इसे ऑनलाइन आज़माएं!


n=>n?n-60?new Date(1900,0,n-(n>60)).toJSON().slice(0,10):'1900-02-29':'1900-01-00'
tsh

@tsh यह वास्तव में बहुत बेहतर है। धन्यवाद। (इसके अलावा, मुझे आश्चर्य है अगर इस दृष्टिकोण किसी भी तरह golfed जा सकता है।)
Arnauld

मुझे अभी पता चला new Date(0,0,1)है कि जैसा है वैसा ही है new Date(1900,0,1)। तो निकालें 1903 बाइट्स बचाता है। और ...
tsh

2
77 बाइट्स: n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')
tsh

क्या इसे GMT0 / -x में चलाने की आवश्यकता है?
l4m2

2

क्लीन , 205 189 बाइट्स

import StdEnv
a=30;b=31;c=1900;r=rem
@m=sum(take m(?c))
?n=[b,if(n>c&&(r n 4>0||r n 100<1&&r n 400>0))28 29,b,a,b,a,b,b,a,b,a,b: ?(n+1)]
$n#m=while(\m= @m<n)inc 0-1
=(c+m/12,1+r m 12,n- @m)

इसे ऑनलाइन आज़माएं!


1
पहला उत्तर जो बिल्ट-इन डेट हैंडलिंग का उपयोग नहीं करता है। अच्छा!
अदाम


1

APL (Dyalog Classic) , 31 बाइट्स

बेनामी tacit उपसर्ग समारोह। के रूप में दिनांक लौटाता है[Y,M,D]

3↑×-60∘≠)+32NQ#263,60∘>+⊢-×

इसे ऑनलाइन आज़माएं!

× दिनांक कोड का चिह्न

⊢- तर्क से घटाएँ (दिनांक कोड)

60∘>+ वेतन वृद्धि अगर तारीख कोड साठ से ऊपर है

2⎕NQ#263, "इवेंट 263" के लिए तत्काल तर्क के रूप में उपयोग करें (आज तक आईडीएन)
IDN एक्सेल की तारीख कोड की तरह है, लेकिन 29 फरवरी, 1900 के बिना, और 1 जनवरी, 1900 से पहले का दिन 31 दिसंबर, 1899 है

3↑ उस के पहले तीन तत्वों को लें (चौथा सप्ताह का दिन)

()+ निम्नलिखित उन में जोड़ें:

60∘≠ 0 यदि दिनांक कोड 60 है; 1 यदि दिनांक कोड 60 नहीं है

×- दिनांक कोड के संकेत से घटाएँ

¯3↑ पिछले तीन तत्वों (वहाँ केवल एक है) (दो) शून्य के साथ पैडिंग करें

चैट में @ Adám के साथ मिलकर विकसित हुआ




0

टी-एसक्यूएल, 141 95 94 बाइट्स

SELECT IIF(n=0,'1/0/1900',IIF(n=60,'2/29/1900',
FORMAT(DATEADD(d,n,-IIF(n<60,1,2)),'d')))FROM i

लाइन ब्रेक केवल पठनीयता के लिए है।

इनपुट को पूर्व-मौजूदा तालिका i के माध्यम से पूर्णांक फ़ील्ड n , हमारे IO मानकों के अनुसार लिया जाता है

SQL अपने आंतरिक दिनांक प्रारूप के लिए 1-1-1900 शुरुआती बिंदु के समान (लेकिन सही किया गया) का उपयोग करता है, इसलिए मुझे केवल 1 या 2 दिनों तक इसकी भरपाई करनी होगी DATEADD फ़ंक्शन ।

SQL किसी दिनांक और वर्ण मानों के मिश्रण वाले कॉलम को आउटपुट नहीं कर सकता है, इसलिए मैं FORMATकमांड को बंद नहीं कर सकता (क्योंकि तब यह 1/0/1900एक तारीख में बदलने की कोशिश करेगा , जो कि निश्चित रूप से अमान्य है)।

SQL के बारे में क्या अच्छा है कि मैं सभी इनपुट मानों को तालिका में लोड कर सकूं और उन सभी को एक साथ चला सकूं। मेरे (यूएस) इलाके का m/d/yyyyडेट फॉर्मेट में चूक :

n       output
0       1/0/1900
1       1/1/1900
2       1/2/1900
59      2/28/1900
60      2/29/1900
61      3/1/1900
100     4/9/1900
1000    9/26/1902
10000   5/18/1927
43432   11/28/2018
100000  10/14/2173

संपादित करें : IIF()बहुत अधिक क्रिया के बजाय एक नेस्टेड में बदलकर 46 बाइट्स सहेजे गए CASE WHEN

EDIT 2 : -सामने की ओर बढ़ते हुए एक और बाइट को बचाया IIF

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.