শেলের মধ্যে তারিখের বৈধতা


14

আমি শেল স্ক্রিপ্টে নীচের তারিখের ফর্ম্যাটটি বৈধ করতে চাই

2015-Jul-13

আমি ব্যবহার করছি date -d "2015-Jul-13" +"%Y-%b-%d"কিন্তু এটির ত্রুটি হিসাবে

date: invalid date '2015-Jul-13'

@ পান্ড্য: ওপি তার প্রশ্ন সম্পর্কে পরিষ্কার। ওপি উল্লিখিত তারিখের বিন্যাসটি বৈধ করতে (প্রবেশের তারিখটি বৈধ কিনা তা পরীক্ষা করতে চায়) তবে এটি প্রবেশের তারিখটি অবৈধ বলে saying
থিশি

জিএনইউ dateচিনতে পারে না YYYY-MMM-DD। আপনি ব্যবহার করতে পারেন YYYY-MM-DDবা DD MMM YYYYপরিবর্তে?
রোয়াইমা

আমি বেশ নিশ্চিত at, এবং - আমি মনে করি - touchএটিও করে। আমি একবারের উপর ভিত্তি করে একটি তারিখের বৈধতা শেল ফানভিশন লিখেছি touch... না, না touch- এটি কেবল সংখ্যাগুলি পরিচালনা করে, তবে atকিছু গভীর
ডিগ্রী দেয়

@ থুশি আসুন আমাদের দ্বারা নিষ্ক্রিয় মন্তব্য সাফ করুন
পান্ড্য

6
শিরোনামটি ভুলভাবে লিখেছেন: তারিখের বৈধতা নরক
অ্যাডাম ডেভিস

উত্তর:


12

জিএনইউ dateসমর্থন করে না YYYY-MMM-DD। তবে, এটি বুঝতে পারে DD-MMM-YYYY। সুতরাং যদি আপনাকে সত্যিই এই ফর্ম্যাটটির তারিখগুলি পরিচালনা করতে হয় তবে আপনি এটির মতো কিছু দিয়ে এটি করতে পারেন যা আর্গুমেন্টগুলিকে এমন ফর্ম্যাটের আশেপাশে বদলে দেয় যা dateপ্রত্যাশা করে:

ymd='2015-Jul-13'

dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

এখানে একটি সমস্ত শেল সমাধান। এটি ভেঙে দিয়ে, IFS=-নির্দেশাবলী -শেলটিকে হোয়াইটস্পেসের পরিবর্তে হাইফেন দ্বারা আগত কমান্ড লাইনটি বিভক্ত করতে বলে । set $ymdParses $ymdএকটি কমান্ড লাইন হিসাবে পরিবর্তনশীল, কিন্তু এখন, হাইফেন দ্বারা splits প্যারামিটার মান নির্ধারণের $1, $2 সেকecho "$3-$2-$1"জাভাস্ক্রিপ্টে গার্বেজ বিপরীত অনুক্রমে তিনটি দখল মান আউটপুট।

ymd='2015-Jul-13'

dmy=$(IFS=-; set $ymd; echo "$3-$2-$1")
if date --date "$dmy" >/dev/null 2>&1
then
    echo OK
fi

@ মিমকিজার: শীতলতা! এটি দিয়ে কাজ করেছে: ymd=$(IFS=-;set $ymd; echo "$3-$2-$1") আপনি সম্ভবত setকমান্ডের পিছনে যাদুটি প্রকাশ করতে পারেন ?
জয়পড

11

ম্যানপেজ থেকে:

DATE STRING
       The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800"
       or  "2004-02-29  16:21:42" or even "next Thursday".  A date string may contain items indicating calendar date,
       time of day, time zone, day of week, relative time, relative date, and numbers.  An empty string indicates the
       beginning  of  the  day.   The  date string format is more complex than is easily documented here but is fully
       described in the info documentation.

তবে এটি YYYY-MMM-DDফর্ম্যাটটি স্বীকৃত বলে মনে হচ্ছে না । সুতরাং, আপনি নীচের থেকে বা অনুরূপ ব্যবহার করতে পারেন:

$ date -d "2015-07-13" +"%Y-%b-%d"
2015-Jul-13
$ date -d "Jul 13 2015" +"%Y-%b-%d"
2015-Jul-13
$ date -d "13 Jul 2015" +"%Y-%b-%d"
2015-Jul-13

অথবা আপনি এটিকে পাঠানোর আগে এটিকে রূপান্তর / পুনরায় গঠন করতে হবে date!

এছাড়াও আপনি কীভাবে আজকের ইনপুটটির জন্য একটি বিন্যাস নির্দিষ্ট করবেন?


আমি দেখার জন্য পরামর্শ দিই: তারিখ ইনপুট ফর্ম্যাটগুলি

এখানে বিধি রয়েছে।

সংখ্যাসমূহের জন্য , আইএসও 8601 ফর্ম্যাটটি 'বছরের-মাস-দিন' অনুমোদিত, যেখানে বছর কোনও ধনাত্মক সংখ্যা, মাস 01 এবং 12 এর মধ্যে একটি সংখ্যা, এবং দিনটি 01 এবং 31 এর মধ্যে একটি সংখ্যা। একটি শীর্ষস্থানীয় শূন্য উপস্থিত থাকতে হবে যদি একটি সংখ্যা দশেরও কম হয়। যদি বছরটি 68 বা তার চেয়ে কম হয়, তবে 2000 এর সাথে যুক্ত হয়; অন্যথায়, বছর যদি 100 এরও কম হয়, তবে 1900 এতে যুক্ত করা হয়। মার্কিন যুক্তরাষ্ট্রে জনপ্রিয় 'মাস / দিন / বছর' নির্ধারণ করা হয়েছে। বছরের বাদ দিয়ে 'মাস / দিন' year

আক্ষরিক মাসগুলি পুরোপুরি বানান হতে পারে: 'জানুয়ারি', 'ফেব্রুয়ারি', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', ' নভেম্বর 'বা' ডিসেম্বর '। আক্ষরিক মাসগুলি তাদের প্রথম তিনটি বর্ণের সংক্ষিপ্তসার হতে পারে, সম্ভবত সংক্ষিপ্ত বিন্দুর পরে। এটি 'সেপ্টেম্বর' পরিবর্তে 'সেপ্টেম্বর' লেখার অনুমতি রয়েছে।

যখন মাসগুলি আক্ষরিকভাবে লেখা হয় , ক্যালেন্ডারের তারিখ নিম্নলিখিত যে কোনও হিসাবে দেওয়া যেতে পারে:

 দিন মাস বছর বছর
 দিন মাস
 মাসের দিন বছর
 -মাস-বছর

আমার দ্বারা জোর দেওয়া

এখানে আপনি দেখতে পারেন যে বছরের-মাস-দিনের মতো কোনও ফর্ম্যাট নেই ! (কয়েক মাস ধরে আক্ষরিক অর্থে লেখা হয়)


7

সঙ্গে zshআপনি ব্যবহার করতে পারে strftimebuiltin (মাধ্যমে উপলব্ধ zsh/datetimeসঙ্গে) -r(রিভার্স):

strftime -r ফর্ম্যাট টাইমস্ট্রিং

যা টাইমস্ট্রিংকে পার্স করতে ফর্ম্যাট ব্যবহার করে এবং যুগের পর থেকে কয়েক সেকেন্ডের সংখ্যা আউটপুট দেয়:

zmodload zsh/datetime
strftime -r %Y-%b-%d 2015-Jul-13
1436734800

তারিখটি অবৈধ থাকলে এই ত্রুটিগুলি আউট হয়:

strftime -r %Y-%b-%d 2015-Jul-33
zsh: strftime: 5: ফর্ম্যাটটি মেলে না

যুগের পর থেকে আপনি সেকেন্ডগুলিকে অন্য কোনও মানক / কাস্টম তারিখের ফর্ম্যাটে যেমন রূপান্তর করতে পারেন

strftime '%A, %B %d, %Y' 1447970400
শুক্রবার, 20 নভেম্বর, 2015
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.