শেল স্ক্রিপ্টে গত মাসের শেষ দিনের তারিখ পান


11

প্রসেসিংয়ের তারিখের ভিত্তিতে আমি কীভাবে আগের মাসের শেষের তারিখ পেতে পারি?

উদাহরণ:

  • প্রক্রিয়া করার তারিখ = 15jan2015
  • প্রত্যাশিত তারিখ = 31 ডিসেম্বর ২০১৪,

  • প্রক্রিয়া করার তারিখ = 10feb2015
  • প্রত্যাশিত তারিখ = 31jan2015

উত্তর:


27

জিএনইউ সহ date:

$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015

কিছু শেলগুলি তারিখের কারসাজির জন্য অন্তর্নির্মিত সমর্থন করে:

সহ ksh93:

$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015

সহ zsh:

$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015

4

এটি করার অনেকগুলি উপায় রয়েছে ; আমি খুঁজে পাওয়া সবচেয়ে সহজ এখানে (জিএনইউ ধরে নিচ্ছি date):

$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015

1
@ স্টাফেনের উত্তরটি পরিষ্কার, হ্যাঁ এটা হয়েছে। দেখতে youtube.com/watch?v=-5wpm-gesOY
Ctrl-Alt-delor

@ রিচার্ড, জিএনইউ তারিখের দিন অফসেট যেভাবে কাজ করে (এক দিনের ২ দিনের অফসেটটি ২৪ ঘন্টা এক হিসাবে হয় না), আমি মনে করি এই উত্তর এবং আমার সমতুল্য হওয়া উচিত এবং কেবল টাইমজোনগুলিতে ব্যর্থ হবে যা এক মাসের শেষ দিন এড়িয়ে যাবে ( সাধারণত, যদি কখনও এমনটি ঘটে থাকে তবে সম্ভবত কোনও প্রশান্ত দ্বীপে -12: 00 অফসেটে 12:00 অফসেটে (বা -13 থেকে 11 ...) ...
স্টাফেন চেজেলাস

@ স্টাফেন অন্যান্য সমস্যাগুলি দেখানোর জন্য ধন্যবাদ, সময় কঠিন। আপনার দ্রষ্ট্রে নোট করুন, যে ক্ষেত্রে মাসের মাঝামাঝি সরিয়ে নেওয়া হয়েছে (এটি হয়েছে) তখন 30 দিনের 30 তম দিন নয়, সুতরাং 30 বিয়োগ করা আপনাকে আগের মাসের শেষ দিনটিতে পাবেন না। আমি দেখতে পাচ্ছি না যে এটি কেন কাজ করবে না, যদি সেখানে মাসের প্রথম দিন থাকে (গ্যারান্টিযুক্ত নয়)। তবে এর অর্থ এই নয় যে এটি হবে।
ctrl-alt-delor

@রিচার্ড, দেখুন TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'। আপনি একটি ত্রুটি পান কারণ সেখানে কোনও 2011-12-30 ছিল না। অর্থাৎ দিবস অফসেটটি ক্যালেন্ডারের সময় করা হয়েছিল। 2011-12-31 বিয়োগ 31 দিন আপনাকে 2011-11-30 দেয় কারণ এটি 31 থেকে 31 নেয়। এটি বর্তমান সময়ের চেয়ে 31 * 24 * 60 * 60 * 60 সেকেন্ড সময় নেয় না। TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'যেটির সাথে আপনি 29 তম প্রদান করেন তার তুলনা করুন , এই বার, তারিখটি 24 * 60 * 60 * 60 সেকেন্ড আগে ছিল।
স্টাফেন চেজেলাস

2

এখানে ম্যাক ওএসে কাজ করা একটি সংস্করণ রয়েছে, যা বিএসডি dateইউটিলিটি ব্যবহার করে :

date -v1d -v-1d +%d%b%Y

যুক্তিগুলি যথাযথভাবে প্রয়োগ করা হয়। আপনি ধরণের কল্পনা করতে পারেন যে একটি যুক্তি থেকে পরের দিকে একটি তারিখ পাইপ করা হয়। উদাহরণ স্বরূপ:

  • বর্তমান তারিখ ( date) -> 2017-03-06 দিয়ে শুরু করুন
  • তারিখটি তার মাসের প্রথম দিনটিতে সেট করুন ( -v1d) -> 2017-03-01
  • এর থেকে এক দিন বিয়োগ করুন ( -v-1d)-> 2017-02-28)
  • ( +%d%b%Y) -> 28Feb2017 তারিখটি ফর্ম্যাট করুন

আপনি যে মাসগুলি চান তার পিছনে বা ফরোয়ার্ড ( ) এর date -v-1m -v1d -v-1dপরিবর্তে ব্যবহার করে আপনি যে কোনও মাসের সামনের বা পিছিয়ে যেতে পারেন।-1m+1m

এটাই জেনেরিক উত্তর। এই প্রশ্নটি একটি নির্দিষ্ট তারিখের সাথে সম্পর্কিত তারিখগুলি সম্পর্কে বিশেষভাবে জিজ্ঞাসা করে। ম্যাক ওএস / বিএসডি তারিখের ইউটিলিটি আপনাকে শুরু করার জন্য একটি ডেটস্ট্যাম্প সরবরাহ করতে দেয় না, তবে আপনি প্রতিটি তারিখের উপাদানটি পৃথকভাবে সেট করতে পারেন:

date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31 ডিসেম্বর ২০১৪


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