তারিখের সময়ের স্ট্রিংকে বাশে রূপান্তরিত করতে রূপান্তর করুন


95

তারিখের সময়ের স্ট্রিংটি নিম্নলিখিত ফর্ম্যাটে রয়েছে: 06/12/2012 07:21:22 :22 আমি কীভাবে এটিকে ইউনিক্স টাইমস্ট্যাম্প বা যুগের মধ্যে রূপান্তর করতে পারি?

উত্তর:


96

আপনি যা খুঁজছেন তা হ'ল date --date='06/12/2012 07:21:22' +"%s"। মনে রাখবেন যে এটি ধরে নিয়েছে যে আপনি জিএনইউ কোর্টিলগুলি ব্যবহার করছেন, কারণ উভয় --dateএবং %sবিন্যাসের স্ট্রিংই জিএনইউ এক্সটেনশন। পসিক্স সেগুলির মধ্যে একটিও নির্দিষ্ট করে না, সুতরাং পসিক্স কমপ্লায়েন্ট সিস্টেমগুলিতে এমন রূপান্তর করার কোনও পোর্টেবল উপায় নেই।

এর অন্যান্য সংস্করণগুলির জন্য উপযুক্ত ম্যানুয়াল পৃষ্ঠায় পরামর্শ করুন date

নোট: ব্যাশ --dateএবং -dবিকল্প মার্কিন যুক্তরাষ্ট্র বা ISO8601 ফরম্যাট, অর্থাত তারিখ আশা mm/dd/yyyyবা yyyy-mm-ddযুক্তরাজ্য, ইউরোপীয় ইউনিয়নের, বা অন্য কোন ফর্ম্যাটে নেই।


9
আমি 'তারিখ: অবৈধ বিকল্প -' পেয়েছি যখন আমি ম্যাক ওএসএক্স 10.8.2 এ চলেছি
বেন ক্লেটন

6
আমার মতো নুবগুলিতে +"%s"আউটপুট ফর্ম্যাট এবং দাঁড়ায় %s1970 এর পর থেকে সেকেন্ডে সময়ের ফর্ম্যাট
রাজ্জ

4
দ্রষ্টব্য: আপনি যদি অন্য টাইমজোন (ইউটিসির মতো) সময় নির্দিষ্ট করতে চান তবে শেষ পর্যন্ত -HHMM বা + এইচএমএমএম যোগ করুন। সুতরাং date --date='06/12/2012 07:21:22 -0000' +"%s"ইউটিসি তারিখটিকে ইউনিক্স টাইম স্ট্যাম্পে রূপান্তরিত করে
গ্রেগ ব্রে

জিএনইউ তারিখের জন্য, আপনি যদি ইউটিসি ব্যবহার করতে চান তবে লক্ষ্য করুন যে ফর্ম্যাটটি gnu.org/software/coreutils/manual/html_node/…yyyy-mm-dd hh:mm:ss এ দেখুন :gdate --date='2019-06-18 00:02:00 +0000' +%s
আশুতোষ জিন্দাল

কোনও ম্যাকের জন্য কাজ করে না ... আমি অবাক হয়ে দেখি যে ম্যাক এবং লিনাক্স উভয় ক্ষেত্রেই কাজ করার কোনও উপায় আছে
অবিচ্ছিন্নতা

50

লিনাক্সের জন্য এই কমান্ডটি চালান

date -d '06/12/2012 07:21:22' +"%s"

ম্যাক ওএসএক্সের জন্য এই কমান্ডটি চালান

date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"

4
ওএসএক্সে টাইমস্ট্যাম্প বর্তমান সময়ের সাথে একরকম বৃদ্ধি পায়। আমার বর্তমানে এর জন্য কোনও ব্যাখ্যা নেই ...
শে

4
আপডেট: এটি কারণ আমার স্থানীয় সময়কালের জন্য টাইমস্ট্যাম্প সামঞ্জস্য করে কারণ এটি ছিল ... একটি -uপতাকা যুক্ত করা ঠিক করা উচিত।
পলিম

@AbdulRehmanJanjua -uপতাকা আসা উচিত সামনে-f বা অন্য শেল ব্যাখ্যা পতাকা, এটা বিন্যাস পংক্তি। সুতরাং, এটি হওয়া উচিত:date -j -u -f "%a..."

4
ম্যাকোস টার্মিনালে হুবহু পেস্ট করা ব্যর্থ।
জিনাক

7
date -jf "%Y-%m-%d %H:%M:%S" "2018-01-08 14:45:00" +%s
ডেভিস্টার

10

এই উত্তরগুলির অনেকগুলি অতিরিক্ত জটিল এবং কীভাবে ভেরিয়েবলগুলি ব্যবহার করবেন তা অনুপস্থিত। এভাবে আপনি স্ট্যান্ডার্ড লিনাক্স সিস্টেমে আরও সহজভাবে এটি করবেন (যেমন পূর্বে উল্লিখিত ডেট কমান্ডটি ম্যাক ব্যবহারকারীদের জন্য সমন্বয় করতে হবে):

নমুনা লিপি:

#!/bin/bash
orig="Apr 28 07:50:01"
epoch=$(date -d "${orig}" +"%s")
epoch_to_date=$(date -d @$epoch +%Y%m%d_%H%M%S)    

echo "RESULTS:"
echo "original = $orig"
echo "epoch conv = $epoch"
echo "epoch to human readable time stamp = $epoch_to_date"

ফলাফল স্বরূপ :

RESULTS:
original = Apr 28 07:50:01
epoch conv = 1524916201 
epoch to human readable time stamp = 20180428_075001

বা একটি ফাংশন হিসাবে:

# -- Converts from human to epoch or epoch to human, specifically "Apr 28 07:50:01" human.
#    typeset now=$(date +"%s")
#    typeset now_human_date=$(convert_cron_time "human" "$now")

function convert_cron_time() {
    case "${1,,}" in
        epoch)
            # human to epoch (eg. "Apr 28 07:50:01" to 1524916201)
            echo $(date -d "${2}" +"%s")
            ;;
        human)
            # epoch to human (eg. 1524916201 to "Apr 28 07:50:01")
            echo $(date -d "@${2}" +"%b %d %H:%M:%S")
            ;;
    esac
}

3
get_curr_date () {
    # get unix time
    DATE=$(date +%s)
    echo "DATE_CURR : "$DATE
}

conv_utime_hread () {
    # convert unix time to human readable format
    DATE_HREAD=$(date -d @$DATE +%Y%m%d_%H%M%S)
    echo "DATE_HREAD          : "$DATE_HREAD
}

6
স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। আপনার কোড ছাড়াও একটি ব্যাখ্যা যুক্ত বিবেচনা করুন।
অলিভিয়ের ডি মুল্ডার

2

ব্যাকগ্রাউন্ড ডেডিকেটেড প্রক্রিয়াdate হিসাবে কার্যকর সমাধান

এই ধরণের অনুবাদকে আরও দ্রুত করার জন্য ...

ভূমিকা

এই পোস্টে, আপনি পাবেন

  • একটি কুইক ডেমো , এটি অনুসরণ করে,
  • কিছু ব্যাখ্যা ,
  • একটি ফাংশন অনেকের জন্য ব্যবহারযোগ্য ইউনিক্স সরঞ্জাম ( bc, rot13, sed...)।

কুইক ডেমো

fifo=$HOME/.fifoDate-$$
mkfifo $fifo
exec 5> >(exec stdbuf -o0 date -f - +%s >$fifo 2>&1)
echo now 1>&5
exec 6< $fifo
rm $fifo
read -t 1 -u 6 now
echo $now

এটি অবশ্যই বর্তমান ইউনিক্সটাইম আউটপুট করে । সেখান থেকে, আপনি তুলনা করতে পারে

time for i in {1..5000};do echo >&5 "now" ; read -t 1 -u6 ans;done
real    0m0.298s
user    0m0.132s
sys     0m0.096s

এবং:

time for i in {1..5000};do ans=$(date +%s -d "now");done 
real    0m6.826s
user    0m0.256s
sys     0m1.364s

Seconds সেকেন্ডেরও কম থেকে সাড়ে সেকেন্ডের কম !! (আমার হোস্টে)

আপনি পরীক্ষা পারে echo $ans, প্রতিস্থাপন "now"দ্বারা "2019-25-12 20:10:00"এবং তাই ...

অপশনালি , আপনি একবার, তারিখের সাবপ্রসেসের প্রয়োজনীয়তা শেষ হতে পারে :

exec 5>&- ; exec 6<&-

মূল পোস্ট (বিস্তারিত ব্যাখ্যা)

রূপান্তর করার জন্য তারিখের সাথে 1 টি কাঁটাচামচ চালানোর পরিবর্তে , dateকেবল 1 বার চালান এবং একই প্রক্রিয়া সহ সমস্ত রূপান্তর করুন (এটি আরও দ্রুত হতে পারে) !:

date -f - +%s <<eof
Apr 17  2014
May 21  2012
Mar  8 00:07
Feb 11 00:09
eof
1397685600
1337551200
1520464020
1518304140

নমুনা:

start1=$(LANG=C ps ho lstart 1)
start2=$(LANG=C ps ho lstart $$)
dirchg=$(LANG=C date -r .)
read -p "A date: " userdate
{ read start1 ; read start2 ; read dirchg ; read userdate ;} < <(
   date -f - +%s <<<"$start1"$'\n'"$start2"$'\n'"$dirchg"$'\n'"$userdate" )

তারপরে এখন একবার দেখুন:

declare -p start1 start2 dirchg userdate

(এর মতো কিছু উত্তর দিতে পারে:

declare -- start1="1518549549"
declare -- start2="1520183716"
declare -- dirchg="1520601919"
declare -- userdate="1397685600"

এক ফাঁসি কার্যকর করা হয়েছিল!

দীর্ঘ চলমান সাবপ্রসেস ব্যবহার করা

আমাদের কেবল একটি ফিফো দরকার :

mkfifo /tmp/myDateFifo
exec 7> >(exec stdbuf -o0 /bin/date -f - +%s >/tmp/myDateFifo)
exec 8</tmp/myDateFifo
rm /tmp/myDateFifo

(দ্রষ্টব্য: প্রক্রিয়া চলছে এবং সমস্ত বর্ণনাকারী খোলা আছে, আমরা নিরাপদে ফিফোর ফাইল সিস্টেম এন্ট্রি সরিয়ে ফেলতে পারি))

তারপর এখন:

LANG=C ps ho lstart 1 $$ >&7
read -u 8 start1
read -u 8 start2
LANG=C date -r . >&7
read -u 8 dirchg

read -p "Some date: " userdate
echo >&7 $userdate
read -u 8 userdate

আমরা একটি সামান্য ফাংশন বিড করতে পারে:

mydate() {
    local var=$1;
    shift;
    echo >&7 $@
    read -u 8 $var
}

mydate start1 $(LANG=C ps ho lstart 1)
echo $start1

বা আমার newConnector ফাংশন ব্যবহার করুন

সংযোগের জন্য ফাংশন সহ , এবং ... MySQL/MariaDBPostgreSQLSQLite

আপনি এগুলিকে গিটহাবের বিভিন্ন সংস্করণে বা আমার সাইটে খুঁজে পেতে পারেন: ডাউনলোড করুন বা শো করুন

wget https://raw.githubusercontent.com/F-Hauri/Connector-bash/master/shell_connector.bash

. shell_connector.bash 
newConnector /bin/date '-f - +%s' @0 0

myDate "2018-1-1 12:00" test
echo $test
1514804400

নোট: উপর GitHub ফাংশন এবং পরীক্ষা ফাইল বিভক্ত করা হয়। উপর আমার সাইট পরীক্ষা কেবল চালানোর যদি এই স্ক্রিপ্টের নয় sourced

# Exit here if script is sourced
[ "$0" = "$BASH_SOURCE" ] || { true;return 0;}

2

আপনি কোন টাইমজোনটি ব্যবহার করতে চান তা নিশ্চিত হন।

datetime="06/12/2012 07:21:22"

সর্বাধিক জনপ্রিয় ব্যবহারের জন্য মেশিনের সময় অঞ্চল লাগে।

date -d "$datetime" +"%s" #depends on local timezone, my output = "1339456882"

তবে আপনি যদি ইচ্ছাকৃতভাবে ইউটিসি ডেটটাইমটি পাস করতে চান এবং আপনি উপযুক্ত সময় অঞ্চল চান তবে আপনার -uপতাকা লাগাতে হবে। অন্যথায় আপনি এটিকে আপনার স্থানীয় সময় অঞ্চল থেকে রূপান্তর করেন।

date -u -d "$datetime" +"%s" #general output = "1339485682"

আমার তারিখের ফর্ম্যাটটি যদি "YYYYmmdd" হয় তবে কী হবে? প্রাক্তন 20200827
মায়ুর

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