একটি এক্সেল তারিখ কোডটিকে একটি "তারিখ" তে রূপান্তর করুন


15

একটি অ-নেতিবাচক পূর্ণসংখ্যা এক্সেল-শৈলীর তারিখ কোড দেওয়া, যে কোনও যুক্তিসঙ্গত ফর্মের সাথে সম্পর্কিত "তারিখ" ফিরিয়ে দিন যা স্পষ্টভাবে বছর, মাস এবং "দিন" দেখায়।

তুচ্ছ, আপনি ভাবতে পারেন। আপনি "ভয়ঙ্কর উক্তি" লক্ষ্য করেছেন? আমি সেগুলি ব্যবহার করেছি কারণ এক্সেলের কিছু বিড়ম্বনা রয়েছে। এক্সেল জানুয়ারী 1 নম্বর 1 দিন, মোট ছাত্র St , 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
প্রতিবছর কি 0 শে জানুয়ারী এবং 29 শে ফেব্রুয়ারী হয় বা 1900 একমাত্র অসঙ্গতি হয়?
শেগি

4
1900 হ'ল অসঙ্গতি। এক্সেল একইরূপে অধিবর্ষ সঠিকভাবে 1900 করা ছাড়া তাদের (যা না একটি অধিবর্ষ)। তবে এটি লোটাসের সাথে সামঞ্জস্যের জন্য ছিল 1-2-2, যেখানে বাগের উদ্ভব হয়েছিল।
রিক হিচকক

3
@ রিকহিচকক স্পষ্টতই, লোটাস 1-2-2-3 ডিভস লিপ ইয়ার কোডটি সংরক্ষণের জন্য করেছিল, যাতে নিয়মটি প্রতি চতুর্থ বছরেই হয়ে যায়। সঙ্গত কারণেও; 1900 অতীতে ছিল, এবং 2100 খুব ভাল, কিছু সময়ের মধ্যে।
অ্যাডাম

3
@ রিকহিচকক এটি খুব ভালভাবেই হতে পারে যে মূল লোটাস ১-২-৩ ওয়াই 2 কে পরিচালনা করতে পারে না, এবং তাই মাইক্রোসফ্ট সিদ্ধান্ত নিয়েছে যে এই সমস্যাটির নকল করবে, তবে অন্যথায় সঠিক থাকবে। 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
এটি কেবল উইন্ডোজের জন্য এক্সেলে কাজ করে। ম্যাকেলের জন্য এক্সেলের একটি সংখ্যা সিস্টেম রয়েছে যা ১৯০০ সালে নয় ১৯০৪ সালে শুরু হয়। এটি ১৯০০ সালে কোনও বছরের তারিখের প্রতিবেদন করবে না যা পরীক্ষার মামলার অংশ of আপনি উল্লেখ করতে পারেন যে এটি উইন্ডোজের জন্য এক্সেল।
কেতা - মনিকা

1
@ কিটা এটির জন্য ম্যাক্সের জন্য এক্সেলে কাজ করার জন্য, পছন্দগুলিতে কেবল "1904 তারিখের সিস্টেমটি ব্যবহার করুন" অন্বেষণ করুন ।
ব্র্যাডিসি

1
@ ব্র্যাডসি সত্য হলেও, কোনও প্রোগ্রামের ডিফল্ট কনফিগারেশনের যে কোনও পরিবর্তন পুরোপুরি ঠিক আছে তবে উত্তরটিতে অবশ্যই অন্তর্ভুক্ত করা উচিত। আমি উত্তরটি উন্নত করার জন্য এটি হিসাবে একটি মন্তব্য। আমি বলব যে হয় এটির নামটি উইন্ডোজের জন্য এক্সেলের কাছে স্যুইচ করুন, ক্যাভিয়েট যুক্ত করুন, বা ওপেনঅফিস ক্যাল্কে স্যুইচ করুন (বা অনুরূপ, যেহেতু তারা উদ্দেশ্যমূলকভাবে বাগটিও অন্তর্ভুক্ত করেছেন)। কোডগল্ফ.মেটা.স্ট্যাকেক্সেঞ্জাওয়েশনস
১০০

6

k (kdb + 3.5), 55 54 51 50 বাইট

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

পরীক্ষা করতে, কিউ কনসোলে এই লাইনটি আটকে দিন:

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এর xমধ্যে 0 602 বা সূচক না পাওয়া গেলে

ˋ1900.01.00ˋ1900.02.29 দুটি চিহ্নের একটি তালিকা

, এটি যুক্ত করুন

"d"$ একটি তারিখে রূপান্তরিত

x-36526 ১৯০০ সাল থেকে দিনের সংখ্যা (ডিফল্ট 2000 এর পরিবর্তে)

- x<60 এক্সেলের লিপ ত্রুটির জন্য সামঞ্জস্য করুন

(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)@ 0 60?xজুস্টেপজেশন মানে সূচীকরণ - মাঝখানে "@" অন্তর্নিহিত

$ স্ট্রিং রূপান্তর


1
কে (কে 5 / কে 6, আমার মনে হয়) এর আলাদা সংস্করণের জন্য, {$[x;$`d$x-65746;"1900.01.00"]} মনে হচ্ছে এটি কাজ করে । আমি ধরে নিই যে কোথাও কোথাও কিছু উপচে পড়েছে 100000
zgrep

@zgrep আপনার পোস্ট করা উচিত যেহেতু কে এর সংস্করণগুলি মূলত সম্পূর্ণ ভিন্ন languages
অ্যাডম

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 এনএনজি ধন্যবাদ ।


দ্রষ্টব্য: আমি নিশ্চিত যে এটি লম্বা হিসাবে লম্বা হয়ে উঠবে, কারণ ফলাফলের বিন্যাসটি আলাদা হওয়া উচিত নয়।
এরিক দি আউটগলফার

3

জাভাস্ক্রিপ্ট (ES6),  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

@ এসটিএইচ সত্যই এটি অনেক ভাল। ধন্যবাদ। (এছাড়াও, আমি ভাবছি যদি এই পদ্ধতির একরকম 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

এপিএল (ডায়ালগ ক্লাসিক) , 31 বাইট

বেনামে ট্যাসিট প্রিফিক্স ফাংশন। হিসাবে তারিখ ফেরত[Y,M,D]

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

এটি অনলাইন চেষ্টা করুন!

× তারিখের কোড সাইন ইন

⊢- আর্গুমেন্ট (তারিখের কোড) থেকে এটি বিয়োগ করুন

60∘>+ তারিখের কোডটি ষাটের উপরে incre

2⎕NQ#263, "ইভেন্ট 263" (আইডিএন টু ডেট) এর তাত্ক্ষণিক যুক্তি হিসাবে এটি ব্যবহার করুন
আইডিএন হ'ল এক্সেলের তারিখের কোডের মতো তবে ২৯ শে ফেব্রুয়ারী, ১৯০০, এবং ১ জানুয়ারী, ১৯০০ এর আগের দিনটি ছিল 31 ডিসেম্বর 1899 18

3↑ এর প্রথম তিনটি উপাদান নিন (চতুর্থটি হ'ল সপ্তাহের দিন)

()+ এর সাথে নিম্নলিখিতগুলি যুক্ত করুন:

60∘≠ 0 যদি তারিখের কোড 60 হয়; তারিখের কোড 60 না হলে 1

×- তারিখের কোডের সাইন থেকে এটি বিয়োগ করুন

¯3↑ (দুটি) জিরো সহ সর্বশেষ তিনটি উপাদান (কেবল একটি মাত্র) প্যাডিং নিন

চ্যাটে @ অ্যাডামের সাথে একসাথে বিকাশ হয়েছে




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

লাইন বিরতি কেবল পঠনযোগ্যতার জন্য।

ইনপুট পূর্ব বিদ্যমান টেবিল মাধ্যমে নেওয়া হয় আমি পূর্ণসংখ্যা ক্ষেত্র সহ এন , আমাদের আই মান অনুযায়ী

এসকিউএল এর অভ্যন্তরীণ তারিখের ফর্ম্যাটটির জন্য 1-1-1900 প্রারম্ভিক পয়েন্টটি ব্যবহার করে তবে এটি কেবল DATEADDফাংশনে 1 বা 2 দিনের মধ্যে অফসেট করতে হবে ।

এসকিউএল তারিখ এবং চরিত্রের মানগুলির মিশ্রণ সহ একটি কলাম আউটপুট দিতে পারে না, সুতরাং আমি FORMATআদেশটি ছাড়তে পারি না (যেহেতু এটি তখন 1/0/1900একটি তারিখে রূপান্তরিত করার চেষ্টা করবে যা অবশ্যই অবৈধ)।

এসকিউএল সম্পর্কে যা দুর্দান্ত তা হল আমি সমস্ত ইনপুট মানগুলি টেবিলের মধ্যে লোড করতে এবং সেগুলি একবারে চালাতে পারি। আমার (মার্কিন) স্থানীয় একটি 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

সম্পাদনা 2 : -এর সামনে সরিয়ে আরেকটি বাইট সংরক্ষণ করা হয়েছে IIF

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.