লিনাক্স, ডিএসটি-নিরাপদে ব্যাশে গতকালের তারিখ পান


158

আমার কাছে একটি শেল স্ক্রিপ্ট রয়েছে যা লিনাক্সে চলে এবং এই কলটি ব্যবহার করে গতকালের তারিখ YYYY-MM-DDবিন্যাসে পেতে:

date -d "1 day ago" '+%Y-%m-%d'

এটি বেশিরভাগ সময় কাজ করে, তবে গতকাল সকালে স্ক্রিপ্টটি যখন চলে তখন 2013-03-11 0:35 CDTএটি "2013-03-09"পরিবর্তে ফিরে আসে "2013-03-10"

সম্ভবত দিবালোক সঞ্চয় সময় (যা গতকাল শুরু হয়েছিল) এর জন্য দোষ দেওয়া যায়। আমি অনুমান করছি যে উপায়টি "1 day ago"কার্যকর হয়েছে 24 ঘন্টা এটি বিয়োগ করেছে, এবং 24 ঘন্টা আগে 2013-03-11 0:35 CDTছিল 2013-03-09 23:35 CST, যা ফলাফলের দিকে নিয়েছিল "2013-03-09"

তাহলে লিনাক্সের উপর গতকালের তারিখটি পাওয়ার জন্য একটি ভাল ডিএসটি-নিরাপদ উপায় কী?


আপনি কি সর্বদা এটি একই সময়ে চালাচ্ছেন, আপনি কি বারবার এটি চালাচ্ছেন?
Tink

@ টিঙ্ক এটি প্রতিদিন চলবে 00:35
আইকে ওয়াকার

উত্তর:


267

আমার মনে হয় আপনি কতবার এবং কখন এটি চালান তা নির্বিশেষে এটি কাজ করা উচিত ...

date -d "yesterday 13:00" '+%Y-%m-%d'

1
আপনি কীভাবে এটিকে পরবর্তীতে ব্যবহারের জন্য কোনও ভেরিয়েবলের কাছে বরাদ্দ করবেন?
নাল

6
@ নাল - একইভাবে আপনি অন্য কোনও শেল কমান্ডের আউটপুট বরাদ্দ করেছেন। পরিবর্তনশীল = $ (তারিখ -d "গতকাল 13:00" '+% Y-% m-% d') ...
টিঙ্ক

জিএনইউ-তারিখের জন্য:date -d yesterday 13:00 -I
গোগস্টাড

এটি গ্রীষ্ম এবং শীতের সময়গুলির মধ্যে স্যুইচিং সর্বদা রাতের সময় করা হয়, এই বিষয়টিটির উপর নির্ভর করে যদি আমি সঠিকভাবে বুঝতে পারি?
নিকোলাস রাউল

2
@ নিকোলাসরোল: এটির নিশ্চয়তা নেই; তবে এটি ভোরের দিকে নির্ধারণ করার জন্য এটি একটি বহুল-অনুসরণীয় সম্মেলন। অন্যদিকে, আইআইআরসি-র কোনও জায়গা নেই যেখানে স্থানীয় দুপুরের কাছাকাছি সুইচটি ঘটবে। সুতরাং, "1300 জে কখনই ডিএসটি সীমানায় থাকে না" এটি একটি যুক্তিসঙ্গত অনুমান
পিসকভোর

56

ম্যাক ওএসএক্সের অধীনে তারিখটি কিছুটা আলাদা।

গতকালের জন্য

date -v-1d +%F

গত সপ্তাহের জন্য

date -v-1w +%F

8
যদি ওএসএক্সের মধ্যে জিএনইউ স্টাইলটি ব্যবহার করতে আগ্রহী হয় তবে আপনি gdateহোমব্রিউয়ের coreutilsপ্যাকেজের মধ্যেও ব্যবহার করতে পারেন ।
ব্যবহারকারী 456584

11
তোমার মানে dateআলাদা।
আগস্ট

12

এটিও কাজ করা উচিত, তবে সম্ভবত এটি খুব বেশি:

date -d @$(( $(date +"%s") - 86400)) +"%Y-%m-%d"

ম্যাক ওএস এক্স dateযা yesterdayসিনট্যাক্স সমর্থন করে না এমন মোকাবেলা করার প্রয়োজন হলে এর মতো স্টাফ প্রয়োজন ...
মিক্কো রেন্টালাইনেন

7

আপনি যদি নিশ্চিত হন যে স্ক্রিপ্টটি দিনের প্রথম ঘন্টাগুলিতে চলে, আপনি কেবল এটি করতে পারেন

  date -d "12 hours ago" '+%Y-%m-%d'

বিটিডাব্লু, যদি স্ক্রিপ্টটি প্রতিদিন 00:35-এ চালিত হয় (ক্রন্টব দ্বারা?) আপনার নিজের জিজ্ঞাসা করা উচিত যে যদি ডিএসটি পরিবর্তন সেই মুহুর্তে পড়ে তবে কি হবে; স্ক্রিপ্টটি চলতে পারে না, বা কিছু ক্ষেত্রে দু'বার চালানো যায়। যদিও আধুনিক বাস্তবায়ন এ cronক্ষেত্রে বেশ চালাক


5

তুমি ব্যবহার করতে পার

date -d "30 days ago" +"%d/%m/%Y"

30 দিন আগে তারিখটি পেতে, একইভাবে আপনি 30 দিনের এক্স পরিমাণের সাথে প্রতিস্থাপন করতে পারেন


%Y%m%dপ্রশ্নের মেলাতে আপনার ফর্ম্যাটটি পরিবর্তন করা উচিত । এটি যথাযথভাবে কাজ করার সাথে সাথে আমি উত্সাহিত করেছি।
ইস্পির

4

এখানে একটি সমাধান যা সোলারিস এবং এআইএক্সের সাথেও কাজ করবে।

টাইমজোনটি কয়েক ঘন্টা ঘড়ির বদলে পরিবর্তন করা সম্ভব। দিবালোক সংরক্ষণের কারণে, 24 ঘন্টা আগে আজ বা গতকাল আগের দিন হতে পারে।

আপনি নিশ্চিত যে গতকাল 20 বা 30 ঘন্টা আগে। কোনটি? ওয়েল, সবচেয়ে সাম্প্রতিক একটি যা আজ নেই।

echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

ইকো কমান্ডে ব্যবহৃত -e প্যারামিটারটি ব্যাশের সাথে প্রয়োজন, তবে ksh দিয়ে কাজ করবে না। Ksh এ আপনি একই কমান্ড -e পতাকা ব্যতীত ব্যবহার করতে পারেন।

যখন আপনার স্ক্রিপ্টটি বিভিন্ন পরিবেশে ব্যবহৃত হবে, আপনি স্ক্রিপ্টটি #! / Bin / ksh বা #! / Bin / bash দিয়ে শুরু করতে পারেন। আপনি নতুন লাইনের মাধ্যমে new n প্রতিস্থাপন করতে পারেন:

echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

0

কেবলমাত্র ব্যবহার করুন dateএবং নির্ভরযোগ্য সেকেন্ড:

আপনি যথাযথভাবে উল্লেখ করেছেন যে আপনি যদি ইংরাজী সময় গাণিতিকের উপর নির্ভর করেন তবে অন্তর্নিহিত গণনা সম্পর্কে প্রচুর বিবরণ গোপন রয়েছে। যেমন -d yesterday, এবং-d 1 day ago অন্যরকম আচরণ করবে।

পরিবর্তে, আপনি নির্ভরযোগ্যভাবে নির্ভর করতে পারেন (অবিকল ডকুমেন্টেড) সেকেন্ডের উপর থেকে ইউনিক্সের সূত্রপাত ইউটিসি, এবং বাশ পাটিগণিত যে মুহুর্তটি আপনি চান তা পাওয়ার জন্য:

date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"

এটি অন্য উত্তরে নির্দেশিত হয়েছিল । এই ফর্মটি বিভিন্ন dateকমান্ড লাইন পতাকাযুক্ত প্ল্যাটফর্মগুলিতে আরও বহনযোগ্য , ভাষা-স্বতন্ত্র (যেমন "গতকাল" ফরাসী স্থানীয় ভাষায় "বনাম" হায়ার ")) এবং খোলামেলাভাবে (দীর্ঘমেয়াদে) মনে রাখা সহজ হবে, কারণ ভাল, আপনি এটি ইতিমধ্যে জানুন। আপনি অন্যথায় নিজেকে জিজ্ঞাসা করতেই পারেন: "এটি -d 2 hours agoনাকি -d 2 hour agoআবার ছিল?" বা "এটি -d yesterdayনাকি -d 1 day agoআমি চাই?") এখানে শুধুমাত্র জটিল বিট @

বাশ দিয়ে সজ্জিত এবং অন্য কিছুই:

কেবলমাত্র ব্যাশে বাশ, আপনি প্রিন্টফ বিল্টিনের মাধ্যমেও গতকাল সময় পেতে পারেন:

 %(datefmt)T
     causes printf to output the date-time string resulting from using
     datefmt as a format string for strftime(3).  The  corresponding  argu
     ment  is an integer representing the number of seconds since the
     epoch.  Two special argument values may be used: -1 represents the
     current time, and -2 represents the time the shell was invoked.
     If no argument is specified, conversion behaves as if -1 had
     been  given.
     This is an exception to the usual printf behavior.

সুতরাং,

# inner printf gets you the current unix time in seconds
# outer printf spits it out according to the format
printf "%(%Y-%m-%d)T\n" $(( $(printf "%(%s)T" -1) - 24*3600 ))

বা, সমানভাবে একটি টেম্প ভেরিয়েবলের সাথে (বহিরাগত সাবশেল optionচ্ছিক, তবে পরিবেশের ভারগুলি পরিষ্কার রাখে)।

(
  now=$(printf "%(%s)T" -1);
  printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)

দ্রষ্টব্য: ম্যানপেজটি উল্লেখ করেও যে বিন্যাসটির কোনও যুক্তি %()Tডিফল্ট হিসাবে ধরে নিবে না -1, তার পরিবর্তে আমি 0 পেয়ে যাব বলে মনে করি (আপনাকে ধন্যবাদ, bash ম্যানুয়াল সংস্করণ 4.3.48)


0
date -d "yesterday" '+%Y-%m-%d'

এটি পরে ব্যবহার করতে:

date=$(date -d "yesterday" '+%Y-%m-%d')

2
যদিও এই কোডটি ওপির সমস্যাটি সমাধান করতে পারে, আপনার কোডটি কীভাবে ওপি'র সমস্যাটিকে সম্বোধন করে তার একটি ব্যাখ্যা অন্তর্ভুক্ত করা ভাল। এইভাবে, ভবিষ্যতের দর্শকরা আপনার পোস্ট থেকে শিখতে পারবেন এবং তাদের নিজস্ব কোডে এটি প্রয়োগ করতে পারেন। এসও কোনও কোডিং পরিষেবা নয়, তবে জ্ঞানের সংস্থান। উচ্চমানের, সম্পূর্ণ উত্তরগুলি এই ধারণাটিকে শক্তিশালী করে, এবং এটির উন্নতি হওয়ার সম্ভাবনা বেশি। এই বৈশিষ্ট্যগুলি, এবং আরও প্রয়োজনীয় যে সমস্ত পোস্ট স্ব-অন্তর্ভুক্ত থাকে, তা এস ও ও এর কিছু শক্তি যা প্ল্যাটফর্ম থেকে আমাদের আলাদা করে। আপনি অতিরিক্ত তথ্য যোগ করতে এবং / অথবা উত্স নথির সাথে আপনার ব্যাখ্যা পরিপূরক করতে সম্পাদনা করতে পারেন।
শেরিলহোমান

0

তুমি ব্যবহার করতে পার:

date -d "yesterday 13:55" '+%Y-%m-%d'

বা আপনি যে কোনও সময় পুনরুদ্ধার করতে চান তা বাশ দ্বারা পুনরুদ্ধার করা হবে।

মাসের জন্য:

date -d "30 days ago" '+%Y-%m-%d'

0

এই প্রশ্নটি হিসাবে ট্যাগ করা হয় "ডিএসটি নিরাপদ"

dateইমপ্লিটি বিলম্ব কমান্ড করতে কাঁটাচামচ ব্যবহার করে, খাঁটি বাশ অন্তর্নির্মিত ব্যবহারের জন্য একটি সহজ এবং আরও কার্যকর উপায় রয়েছে:

printf -v tznow '%(%z %s)T' -1
TZ=${tznow% *} printf -v yesterday '%(%Y-%m-%d)T' $(( ${tznow#* } - 86400 ))
echo $yesterday

এটি কাঁটাচামচ করার চেয়ে আরও বেশি সিস্টেম বান্ধব উপর দ্রুততর date

থেকে ভি> = 5.0 , একটি নতুন পরিবর্তনশীল রয়েছে$EPOCHSECONDS

printf -v tz '%(%z)T' -1
TZ=$tz printf -v yesterday '%(%Y-%m-%d)T' $(( EPOCHSECONDS - 86400 ))
echo $yesterday
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.