इंग्लिश लॉन्ग डेट में शॉर्ट डेट


14

जितना संभव हो उतने कम बाइट्स में शॉर्ट डेट फॉर्मेट को इंग्लिश लॉन्ग डेट में कन्वर्ट करें।

इनपुट

इनपुट प्रारूप के साथ एक स्ट्रिंग के रूप में होगा yyyy-mm-dd, जिसमें सभी मानों के लिए शून्य पैडिंग वैकल्पिक होगा। आप मान सकते हैं कि यह वाक्यात्मक रूप से सही है, लेकिन जरूरी नहीं कि यह वैध तिथि हो। नकारात्मक वर्ष के मूल्यों का समर्थन करने की आवश्यकता नहीं है।

उत्पादन

आपको तारीख को अंग्रेजी में लंबी तारीख के प्रारूप (जैसे 14th February 2017) में परिवर्तित करना होगा । यहां जीरो पैडिंग की अनुमति नहीं है।

यदि तारीख अमान्य है (उदाहरण के लिए 2011-02-29), तो इसे किसी तरह से मान्यता दी जानी चाहिए। अपवाद फेंकने की अनुमति है।

अधिक उदाहरण नीचे देखे जा सकते हैं।

परीक्षण के मामलों

"1980-05-12" -> 12th May 1980
"2005-12-3"  -> 3rd December 2005
"150-4-21"   -> 21st April 150
"2011-2-29"  -> (error/invalid)
"1999-10-35" -> (error/invalid)

5
क्या शून्य-पेडिंग की अनुमति है? उर्फ के 03rdबजाय3rd
वैल्यू इंक

@ValueInk यदि आप मेरी पिछली टिप्पणी पढ़ते हैं, तो इसे अनदेखा करें; मैंने प्रश्न को गलत समझा। आउटपुट में शून्य पैडिंग की अनुमति नहीं है।
गारेथपीडब्ल्यू

क्या हमें 4 से अधिक अक्षरों (जैसे 10987-01-01) पर एक वर्ष पर विचार करना चाहिए?
mdahmoune

@mdahmoune आपको इसका समर्थन करने की आवश्यकता नहीं है जब तक कि ऐसा करना आसान न हो।
गारेथपीडब्ल्यू

किस बारे में 2016-2-29?
ओलिवियर ग्राएगोइरे

जवाबों:


5

PostgreSQL, 61 वर्ण

prepare f(date)as select to_char($1,'fmDDth fmMonth fmYYYY');

तैयार बयान, इनपुट को पैरामीटर के रूप में लेता है।

नमूना रन:

Tuples only is on.
Output format is unaligned.
psql (9.6.3, server 9.4.8)
Type "help" for help.

psql=# prepare f(date)as select to_char($1,'fmDDth fmMonth fmYYYY');
PREPARE

psql=# execute f('1980-05-12');
12th May 1980

psql=# execute f('2005-12-3');
3rd December 2005

psql=# execute f('150-4-21');
21st April 150

psql=# execute f('2011-2-29');
ERROR:  date/time field value out of range: "2011-2-29"
LINE 1: execute f('2011-2-29');
                  ^
psql=# execute f('1999-10-35');
ERROR:  date/time field value out of range: "1999-10-35"
LINE 1: execute f('1999-10-35');
                  ^
HINT:  Perhaps you need a different "datestyle" setting.

अच्छा, काश MS-SQL "वें" स्वरूपण शैली को मान्यता देता।
ब्रैडक

आप सबसे कम बाइट के साथ ठीक से कार्य पूरा करने में कामयाब रहे, यह देखते हुए, मुझे लगता है कि आपका समाधान विजेता है!
गारेथपीडब्ल्यू

वाह। धन्यवाद। यह पूरी तरह से अप्रत्याशित है। अब तक समर्पित गोल्फिंग भाषाओं की अनुपस्थिति पर ध्यान नहीं दिया गया। हालाँकि, केवल एक दिन के बाद एक समाधान स्वीकार करना जल्द ही एक सा है।
मैनटवर्क

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

7

पायथन 3.6, 137 129 बाइट्स

from datetime import*
def f(k):g=[*map(int,k.split('-'))];n=g[2];return f"{date(*g):%-d{'tsnrhtdd'[n%5*(n^15>4>n%10)::4]} %B %Y}"

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


3
%-d%dइसके बजाय आप अपने स्ट्रिंग स्वरूपण में उपयोग कर सकते हैं कि कोई भी गद्दी संस्करण है {g[2]}। इसके अलावा, नहीं 12बनना चाहिए (10-19 से संख्या 1-9 और 20+ के समान नियमों का पालन नहीं करते हैं)12th12nd
मूल्य इंक

1
+1। fस्ट्रिंग्स के बारे में पता नहीं था
फेलिप नारदी बतिस्ता

@ValueInk धन्यवाद! साथ ही, अध्यादेश का मुद्दा भी तय किया
यूरिल

5

जावास्क्रिप्ट (ईएस 6), 142 140 बाइट्स

NaNth Invalid Dateअमान्य दिनांक के लिए आउटपुट ।

क्रमिक संख्याओं के लिए कोड को इस उत्तर से अनुकूलित किया गया था ।

d=>`${s=(D=new Date(d)).getDate()+''}${[,'st','nd','rd'][s.match`1?.$`]||'th'} `+D.toLocaleDateString('en-GB',{month:'long',year:'numeric'})


1
क्रोम में 2011-2-29 के लिए "1 मार्च 2011" देता है। यह एक कठिन तय हो सकता है।
रिक हिचकॉक

5

पायथन 3.6 , 154 बाइट्स

from datetime import*
s=[*map(int,input().split('-'))]
b=s[2]
print(date(*s).strftime(f"%-d{'th'if(3<b<21)+(23<b<31)else('st','nd','rd')[b%10-1]} %B %Y"))

इसे ऑनलाइन आज़माएं! (इनपुट स्ट्रीम सेट करें और फिर चलाएं।)

नीचे टिप्पणीकारों के अच्छे सुझावों के लिए धन्यवाद।


आप के बीच की जगह को निकाल कर एक बाइट को बचा सकता है int(x)और forअपनी सूची कंप्यूटर अनुप्रयोग में।
क्रिश्चियन डीन

@ChristianDean धन्यवाद, किया!
ल्यूक सवायजक

(('st','nd','rd')[b%10-1]if b<4 or 20<b<24 else'th')-3 बाइट्स के लिए अपने वर्तमान सशर्त के बजाय।
मूल्य इंक

@ValueInk दुख की बात है, कि 31 वें उत्पादन होगा। एक और तरीका है कि मैं इसे तोड़ने के बारे में सोचता था कि अगर% <b% १० <४ या १० <b <१४ नहीं है लेकिन यह किसी भी बाइट को नहीं बचाता है।
ल्यूक सवायजक

उस स्थिति में, दुर्व्यवहार प्रकार का दुरुपयोग। (3<b<21)+(23<b<31)-1 बाइट के लिए। इसे ऑनलाइन आज़माएं!
मूल्य इंक

5

PHP, 87 बाइट्स

<?=checkdate(($a=explode("-",$argn))[1],$a[2],$a[0])?date("jS F Y",strtotime($argn)):E;

ऑनलाइन के साथ पाइप के रूप में चलाएं -Fया इसका परीक्षण करें । हमेशा 4 अंक वाला वर्ष प्रिंट करता है; साल के लिए विफल> 9999।

वैधता जांच नहीं, 35 बाइट्स:

<?=date("jS F Y",strtotime($argn));

5

बैश + कोरुटिल्स, 115 78

  • 2 बाइट्स @manatwork की बदौलत बच गईं।
d="date -d$1 +%-e"
t=`$d`
f=thstndrd
$d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"

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


1
लगता है कि सरणी के बजाय स्ट्रिंग का उपयोग करने से थोड़ी मदद मिलेगी f=thstndrd; $d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y":।
मैनटवर्क

1
BTW, आपके संशोधन 1 ने एक बैश टिप को प्रेरित किया । ;)
मैनेटवर्क

@manatwork हाँ - इसकी मज़ेदार - मैंने कोशिश की पर विचार किया लेकिन यह नहीं सोचा कि इससे मदद मिलेगी। कुहनी मारने के लिए धन्यवाद।
डिजिटल ट्रामा

4

सी #, 147 143 बाइट्स

s=>{var t=System.DateTime.Parse(s);int d=t.Day,o=d%10;return d+((d/10)%10==1?"th":o==1?"st":o==2?"nd":o==3?"rd":"th")+t.ToString(" MMMM yyy");}

सहेजे गए 4 बाइट्स @The_Lone_Devil की बदौलत।


क्या आप 4 बाइट की बचत के t.Dayसाथ दूसरे को नहीं बदल सकते थे d?
The_Lone_Devil

@ The_Lone_Devil बेशक मैं धन्यवाद दे सकता हूं, मुझे नहीं पता कि मैं कैसे चूक गया।
ललथकोदर

4

MIRC संस्करण 7.49 (197 बाइट्स)

//tokenize 45 2-2-2 | say $iif($3 isnum 1- $iif($2 = 2,$iif(4 // $1 && 25 \\ $1||16//$1,29,28),$iif($or($2,6) isin 615,30,31))&&$2 isnum1-12&&1//$1,$asctime($ctime($+($1,-,$2,-,$3)date), doo mmmm yyyy))

3

रूबी , 104 103 102 + 8 = 112 111 110 बाइट्स

-rdate -pप्रोग्राम के झंडे का उपयोग करता है ।

मैनटवर्क से -1 बाइट।

sub(/.*-(\d*)/){Date.parse($&).strftime"%-d#{d=eval$1;(d<4||d>20)&&"..stndrd"[d%10*2,2]||:th} %B %-Y"}

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


क्या मुझे एक कारण याद आ रहा है कि आपने टर्नरी ऑपरेटर का उपयोग क्यों नहीं किया? d<4||d>20?"..stndrd"[d%10*2,2]:"th"
मैनटवर्क

@manatwork जैसी संख्या लुकअप स्ट्रिंग में 26सूचकांकों को एक्सेस करने की कोशिश करेगी 12..13, जो सीमा से बाहर है, और इस तरह वापस आती है nil। इस प्रकार टर्नरी का उपयोग यह बनाता है d<4||d>20?"..stndrd"[d%10*2,2]||"th":"th", जो 2 बाइट्स से अधिक लंबा है।
वैल्यू इंक

ओह समझा। ठीक है, तो शांत चाल @ValueInk।
मैनटवर्क

लगभग भूल गया, एक छोटे से परिवर्तन: "th":th
मैनटवर्क

2

सी # (.NET कोर) , 167 197 बाइट्स

s=>s.Equals(DateTime.MinValue)?"":s.Day+((s.Day%10==1&s.Day!=11)?"st":(s.Day%10==2&s.Day!=12)?"nd":(s.Day%10==3&s.Day!=13)?"rd":"th")+" "+s.ToString("MMMM")+" "+s.Year

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

+30 बाइट्स के लिए

using System;

DateTime.Parse()


!-1 बाइट से छुटकारा पाने के लिए आप टर्नरी चेक को उल्टा कर सकते हैं । और अगर आप बदल सकते हैं &&करने के लिए &-3 बाइट्स के लिए। इसके अलावा, जब से आप s.Day7 बार उपयोग करते हैं, तो इसके लिए अस्थायी मूल्य बनाने के लिए कुछ बाइट्स बचाता है:s=>{var t=s.Day;return s.Equals(DateTime.MinValue)?"":t+((t%10==1&t!=11)?"st":(t%10==2&t!=12)?"nd":(t%10==3&t!=13)?"rd":"th")+" "+s.ToString("MMMM")+" "+s.Year;}
केविन क्रूज़सेन

@KevinCruijssen धन्यवाद!
काकरोत

आपको ऑब्जेक्ट को शामिल करने using System;या पूरी तरह से योग्य बनाने की भी आवश्यकता है DateTime
द लीथलकोडर

इसके अलावा DateTime.MinValueहै 1-1-1तो मैं आपको लगता है कि जांच की जरूरत नहीं लगता। जो मेरे पिछले बिंदु को भी अप्रासंगिक बना देगा।
TheLethalCoder

1
एक इनपुट के रूप में लेना DateTimeऔर विधि के बाहर पार्स करना स्वीकार्य नहीं है, आपको विधि के अंदर सभी काम करना चाहिए। या काम को विभाजित करने के लिए एक अतिरिक्त विधि जोड़ें।
TheLethalCoder

2

एक्सेल, 212 बाइट्स

=ABS(RIGHT(A1,2))&IF(ABS(ABS(RIGHT(A1,2))-12)<2,"th",SWITCH(RIGHT(A1,1),"1","st","2","nd","3","rd","th"))&TEXT(MID(A1,FIND("-",A1)+1,FIND("-",REPLACE(A1,1,FIND("-",A1),""))-1)*30," mmmm ")&LEFT(A1,FIND("-",A1)-1)

यदि आप इसे प्रत्येक एम्परसेंड में विखंडू में तोड़ते हैं, तो आपको ये टुकड़े मिलते हैं:

  • ABS()स्ट्रिंग में अंतिम दो वर्णों से दिन संख्या खींचता है। चूँकि इसमें एक हाइफ़न शामिल हो सकता है, ABSइसे धनात्मक में परिवर्तित करता है।
  • IF((ABS-12)<2,"th",SWITCH())क्रमिक जोड़ता है। -12बिट है, क्योंकि 11, 12, और 13 सामान्य नियम का पालन नहीं करते और वे सब मिल thके बजाय st, nd, और rd। इसके लिए यह सही है।
    • नोट: SWITCHफ़ंक्शन केवल Excel 2016 और बाद में उपलब्ध है। ( स्रोत ) यह CHOOSEइस मामले की तुलना में छोटा है क्योंकि यह कोई मान वापस कर सकता है यदि कोई मैच नहीं मिला है जबकि CHOOSEसंख्यात्मक इनपुट की आवश्यकता होती है और प्रत्येक संभावित मूल्य के लिए एक ही रिटर्न होना चाहिए।
  • TEXT(MID()*30," mmmm ")महीने का नाम निकालता है। MID()महीने की संख्या को एक स्ट्रिंग के रूप में बाहर निकालता है और एक संख्या को 30 से गुणा करता है। एक्सेल उस संख्या को एक तारीख (1900-01-30, 1900-02-29, 1900-03-30, आदि) के रूप में देखता है और TEXT()इसे दोनों छोरों पर एक स्थान के साथ एक महीने के नाम के रूप में प्रारूपित करता है। 28 और 29 को भी काम किया होगा लेकिन 30 "अच्छे" लग रहे हैं।
  • LEFT() वर्ष संख्या निकालता है।

अब, यह सब देखते हुए, यह आसान होता अगर परीक्षण के मामले सभी तिथि सीमा में होते जो एक्सेल एक वास्तविक तारीख: 1900-01-01 से 9999-12-31 के रूप में संभाल सकता है। बड़ा फायदा यह है कि पूरी तारीख एक ही बार में स्वरूपित की जाती है। वह समाधान 133 बाइट्स है :

=TEXT(DATEVALUE(A1),"d""" & IF(ABS(ABS(RIGHT(A1,2))-12)<2,"th",SWITCH(RIGHT(A1,1),"1","st","2","nd","3","rd","th")) & """ mmmm yyyy")

अन्य बड़ी बाधा को अध्यादेश में शामिल करना था। इसके बिना, समाधान सिर्फ 34 बाइट्स है :

=TEXT(DATEVALUE(A1),"d mmmm yyyy")

1

स्विफ्ट 3: 298 बाइट्स

let d=DateFormatter()
d.dateFormat="yyyy-MM-dd"
if let m=d.date(from:"1999-10-3"){let n=NumberFormatter()
n.numberStyle = .ordinal
let s=n.string(from:NSNumber(value:Calendar.current.component(.day, from:m)))
d.dateFormat="MMMM YYY"
print("\(s!) \(d.string(from:m))")}else{print("(error/invalid)")}

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


8
साइट पर आपका स्वागत है! यहां लक्ष्य यह है कि कोड को जितना संभव हो उतना कम बनाया जाए, मैं देख सकता हूं कि आपके पास लंबे चर नाम और बहुत सारे व्हाट्सएप हैं, आप बहुत सारे बाइट्स को बचाने के लिए इन्हें छोटा और निकाल सकते हैं। हम आमतौर पर के रूप में उत्तर के शीर्ष पर एक हेडर भी शामिल करते हैं # Language, N bytes। यह अच्छा होगा यदि आप एक को भी जोड़ सकते हैं।
ललथकोदर

1

टी-एसक्यूएल, 194 बाइट्स

DECLARE @ DATE;SELECT @=PARSE('00'+i AS DATE)FROM t;PRINT DATENAME(d,@)+CASE WHEN DAY(@)IN(1,21,31)THEN'st'WHEN DAY(@)IN(2,22)THEN'nd'WHEN DAY(@)IN(3,23)THEN'rd'ELSE'th'END+FORMAT(@,' MMMM yyy')

इनपुट हमारे मौजूदा मानकों के अनुसार , पहले से मौजूद टेबल टी में टेक्स्ट कॉलम i के माध्यम से है ।

1 जनवरी, 0001 से 31 दिसंबर, 9999 तक की तारीखों के लिए काम करता है। यह वर्ष कम से कम 3 अंकों (प्रति 150AD उदाहरण) के साथ आउटपुट है।

अमान्य तिथियों के परिणामस्वरूप निम्न बदसूरत त्रुटि होगी:

Error converting string value 'foo' into data type date using culture ''.

भिन्न डिफ़ॉल्ट भाषा / संस्कृति सेटिंग्स इस व्यवहार को बदल सकती हैं। आप एक से थोड़ा अधिक सुंदर त्रुटि निर्गम (शून्य) चाहते हैं, को बदल कर 4 बाइट जोड़ने PARSE()के लिए TRY_PARSE()

प्रारूप और स्पष्टीकरण:

DECLARE @ DATE;
SELECT @=PARSE('00'+i AS DATE)FROM t;
PRINT DATENAME(d,@) + 
    CASE WHEN DAY(@) IN (1,21,31) THEN 'st'
         WHEN DAY(@) IN (2,22)    THEN 'nd'
         WHEN DAY(@) IN (3,23)    THEN 'rd'
         ELSE 'th' END
    + FORMAT(@, ' MMMM yyy')

DATEएसक्यूएल 2008 में शुरू की डेटा प्रकार की तुलना में बहुत व्यापक रेंज की अनुमति देता है DATETIME1 जनवरी 0001 से 31 दिसंबर, 9999 तक,।

मेरी यूएस लोकलिटी सेटिंग्स ("01-02-03" "जनवरी 2 2003" बन जाती है) के साथ कुछ बहुत ही शुरुआती तारीखों को गलत ठहराया जा सकता है, इसलिए मैंने एक जोड़े को अतिरिक्त शून्य पूर्व-निर्धारित किया ताकि यह पता चले कि पहला मूल्य वर्ष है।

उसके बाद, CASEदिन में अध्यादेशिक प्रत्यय को जोड़ने के लिए यह सिर्फ एक गन्दा बयान है। वार्षिक रूप से, SQL FORMATकमांड के पास स्वचालित रूप से ऐसा करने का कोई तरीका नहीं है।


1

क्यू / केडीबी + 210 बाइट्स, गैर-प्रतिस्पर्धी

समाधान:

f:{a:"I"$"-"vs x;if[(12<a 1)|31<d:a 2;:0];" "sv(raze($)d,$[d in 1 21 31;`st;d in 2 22;`nd;d in 3 23;`rd;`th];$:[``January`February`March`April`May`June`July`August`September`October`November`December]a 1;($)a 0)};

उदाहरण:

q)f "2017-08-03"
"3rd August 2017"
q)f "1980-05-12"
"12th May 1980"
q)f "2005-12-3"
"3rd December 2005"
q)f "150-4-21" 
"21st April 150"
q)f "2011-2-29"       / yes it's wrong :(
"29th February 2011"
q)f "1999-10-35"
0

स्पष्टीकरण:

यह एक भयानक चुनौती है क्योंकि कोई तारीख प्रारूपण नहीं है, इसलिए मुझे स्क्रैच (95 बाइट्स) से महीने बनाने के साथ-साथ प्रत्यय भी उत्पन्न करना होगा।

अनगुल्ड सॉल्यूशन नीचे है, मूल रूप से इनपुट स्ट्रिंग को विभाजित करें और फिर एक साथ जुड़ने के बाद हमने प्रत्यय जोड़ा है और महीने को स्विच किया है।

f:{
   // split input on "-", cast to integers, save as variable a
   a:"I"$ "-" vs x;
   // if a[1] (month) > 12 or a[2] (day) > 31 return 0; note: save day in variable d for later
   if[(12<a 1) | 31<d:a 2;
     :0];
   // joins the list on " " (like " ".join(...) in python)
   " " sv (
           // the day with suffix
           raze string d,$[d in 1 21 31;`st;d in 2 22;`nd;d in 3 23;`rd;`th];
           // index into a of months, start with 0 as null, to mimic 1-indexing
           string[``January`February`March`April`May`June`July`August`September`October`November`December]a 1;
           // the year cast back to a string (removes any leading zeroes)
           string a 0)
  };

टिप्पणियाँ:

Q में तिथियाँ केवल ~ 1709 पर वापस जाती हैं, इसलिए मेरे पास दिनांक सत्यापित करने का कोई तुच्छ तरीका नहीं है, इसलिए यह एक गैर-प्रतिस्पर्धी प्रविष्टि है ... सबसे अच्छा मैं यह जांच सकता हूं कि क्या दिन> 31 या महीना है > १२ और वापसी ०।

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