বাশে কীভাবে টাইমস্ট্যাম্পগুলি তারিখগুলিতে রূপান্তর করবেন?


270

আমার শেল কমান্ড বা স্ক্রিপ্ট দরকার যা ইউনিক্স টাইমস্ট্যাম্পকে তারিখে রূপান্তর করে। ইনপুটটি প্রথম প্যারামিটার থেকে বা স্টিডিন থেকে আসতে পারে, নিম্নলিখিত ব্যবহারের ধরণগুলির জন্য অনুমতি দেয়:

ts2date 1267619929

এবং

echo 1267619929 | ts2date

উভয় কমান্ডের "মার্ড মার্চ 3 13:38:49 2010" আউটপুট করা উচিত।

উত্তর:


531

সাধারণ লিনাক্স বিতরণগুলির পরবর্তী সংস্করণগুলিতে আপনি ব্যবহার করতে পারেন:

date -d @1267619929

5
ওয়ান-লাইনার:date -d @$(date -u +%s)
মাইক অ্যাটলাস

26
কিসের @জন্য? আমি জিএনইউ ম্যান পেজে একেবারেই দেখছি না।
মার্ক ই। হাজেস

13
@ মেহাজে - ম্যান পেজটি নোট করেছে যে তারিখের স্ট্রিংটি ম্যানপেজে নথিভুক্ত করার জন্য খুব জটিল, তাই এটি
তথ্যতে

10
brew install coreutils; gdate -d @1267619929
মার্ক ফক্স

2
info 'Date input formats'dateপ্রাসঙ্গিক রবার্ট গ্রুডিনের উদ্ধৃতি এবং তারপরে বিন্যাস নির্দিষ্টকরণের একটি মেনু সহ আপনাকে সরাসরি সোজাইয়ে ফর্ম্যাটিং তথ্য নোডে নিয়ে যায়।
মাইকে

165
date -r <number>

ম্যাক ওএস এক্সে আমার জন্য কাজ করে


5
হ্যাঁ, তবে এটি এক সেকেন্ডের ভগ্নাংশ পরিচালনা করে না।
মিগল্ড

1
এবং এটি বিভ্রান্তিকর কারণ এটি বেশিরভাগ লিনাক্স সিস্টেমে সেভাবে কাজ করছে না, কারণ: ফ্রেডি @ হাদিস ~% তারিখ - সহায়তা | গ্রেপ - -আর -আর, - রেফারেন্স = ফাইল ফাইলের শেষ পরিবর্তনের সময় প্রদর্শন করুন
খোলামেলা 42

1
যদিও এই উত্তরের মন্তব্যগুলি সত্য, এগুলি রাফার দোষ নয়, এবং তারা তার উত্তর হ্রাস করে না।
মাইকে

29

এই সংস্করণটি চিবর্গের উত্তরের অনুরূপ , তবে এটি বাহ্যিক ttyএবং এর প্রয়োজনকে সরিয়ে দেয় cat। এটি ব্যবহার করে dateতবে সহজেই ব্যবহার করতে পারে gawk। আপনি শেবাং পরিবর্তন করতে পারেন এবং দ্বৈত বর্গাকার বন্ধনীগুলি একক দ্বারা প্রতিস্থাপন করতে পারেন এবং এটিও চালু হবে sh

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        read -r p
    else
        echo "No timestamp given." >&2
        exit
    fi
else
    p=$1
fi
date -d "@$p" +%c

+1: খুব সম্পূর্ণ উত্তর এবং আমি মনে করি তারিখ গাকের চেয়ে দ্রুত।
ব্রুনো ব্রেন্ট

ব্রুনো, আপনি কীভাবে জানবেন যে তারিখ গাওয়াকের চেয়ে দ্রুততর?
ghostdog74

3
@Bruno, @ ghostdog74: আমার সিস্টেমে, gawk(খুব মোটামুটিভাবে) 15% চেয়ে দ্রুত dateটাইম মধ্যে forশুধুমাত্র গঠিত লুপ gawk 'BEGIN { print strftime("%c", 1256571985); }'বা date -d '@1256571985' +%cথেকে আপনাকে পুনঃনির্দেশিত আউটপুট /dev/null
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
তারিখটি আমার কাছে গাকের তুলনায় প্রান্তিক (৫%) দ্রুত (ম্যাক ওএসএস ১০.৯.২, তারিখ ৮.২৩, গোক ৪.১.১) তবে (জি) অ্যাডের আসল সুবিধা হ'ল অনেক টাইমস্ট্যাম্পগুলির একটি কলামের পাইপ গ্রহণ করা (দেখুন) আমার উত্তর নীচে), যা স্ক্রিপ্ট যেমন 250x 1000 টাইমস্ট্যাম্পের জন্য দ্রুত করে তোলে।
Webb

3
নোট করুন যে আমার উত্তরটি ওপির প্রয়োজনীয়তার সাথে মিলিত হয়েছে যা প্রশ্নের মধ্যে বলা হয়েছে, তবে এখন গৃহীত উত্তরটি তা পায় না।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

17

আপনি জিএনইউ তারিখ ব্যবহার করতে পারেন, উদাহরণস্বরূপ,

$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"

অথবা

$ date -ud @1267619929

10

আপনি এই সাধারণ অজানা স্ক্রিপ্টটি ব্যবহার করতে পারেন:

#!/bin/gawk -f   
{ print strftime("%c", $0); }

নমুনা ব্যবহার:

$ echo '1098181096' | ./a.awk 
Tue 19 Oct 2004 03:18:16 AM PDT
$

এটি প্রথম ব্যবহারের সাথে খাপ খায় না - কখনও কখনও আমি টিএস প্রতিধ্বনি করতে চাই না এবং পরিবর্তে একটি পরামিতি ব্যবহার করতে চাই না।
chiborg

কিছু পুরানো ব্যস্তবক্স সংস্করণে, date -s @কাজ করে না এবং awkএখনও করে! স্টিডিন ব্যতীত একটি উদাহরণও সহায়ক হবে।
ভিক্টর সার্জিইঙ্কো

8

4.2 বাশ যেহেতু আপনি printfএর %(datefmt)Tবিন্যাসটি ব্যবহার করতে পারেন :

$ printf '%(%c)T\n' 1267619929
Wed 03 Mar 2010 01:38:49 PM CET

এটি দুর্দান্ত, কারণ এটি একটি শেল অন্তর্নির্মিত। ডেটফেম্টের জন্য ফর্ম্যাটটি strftime(3)(দেখুন man 3 strftime) দ্বারা গৃহীত একটি স্ট্রিং । এখানে %c:

%c বর্তমান লোকেলের জন্য পছন্দসই তারিখ এবং সময় উপস্থাপনা।


এখন আপনি যদি এমন কোনও স্ক্রিপ্ট চান যা কোনও যুক্তি গ্রহণ করে এবং, যদি কোনও সরবরাহ না করা হয়, স্টিডিন পড়ে, আপনি এইভাবে এগিয়ে যেতে পারেন:

#!/bin/bash

if (($#)); then
    printf '%(%c)T\n' "$@"
else
    while read -r line; do
        printf '%(%c)T\n' "$line"
    done
fi

6

লগ ফাইলগুলি রূপান্তর করার সময় বা তাদের নিরীক্ষণের সময় আমি এটি ব্যবহার করি:

tail -f <log file> | gawk \
'{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'

ঠিক আমি যা খুঁজছিলাম, তা সংক্ষিপ্ত করা যেতে পারেawk '{ printf strftime("%c: ", $1); $1 = ""; print $0; }'
ক্রিসউইউ

5

ওএসএক্স, বা বিএসডি-তে একটি সমতুল্য -rপতাকা রয়েছে যা সম্ভবত একটি ইউনিক্স টাইমস্ট্যাম্প নেয়। এখানে একটি উদাহরণ যা চারবার তারিখ চলে: প্রথম তারিখের জন্য একবার, এটি কী তা দেখানোর জন্য; একটিকে ইউনিক্স টাইমস্ট্যাম্পের সাথে রূপান্তর করার জন্য %s, এবং শেষ অবধি, যা দিয়ে স্ট্রিংয়ে -rযা %sসরবরাহ করে তা রূপান্তর করে।

$  date; date +%s; date -r `date +%s`
Tue Oct 24 16:27:42 CDT 2017
1508880462
Tue Oct 24 16:27:42 CDT 2017

কমপক্ষে, আমার মেশিনে কাজ করছে বলে মনে হচ্ছে।

$ uname -a
Darwin XXX-XXXXXXXX 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64

আপনার যদি ইতিমধ্যে একটি টাইমস্ট্যাম্প মান রয়েছে এবং আপনার কেবল সমমানের তারিখটি সন্ধান করতে হবে, ওএস এক্স-এ আপনি কেবল কমান্ড লাইনে এটি টাইপ করতে পারেন: তারিখ -r 1509453417
নোয়েল হোয়াইটমোর

1
সেটা সত্য. আপনি যদি আমার উত্তরটি দেখুন, আমি আসলে এটি প্রদর্শন করছি।
ড্যানিয়েল ফারেল

5

আপনি এই জাতীয় টাইমস্ট্যাম্প থেকে ফর্ম্যাট তারিখ পেতে পারেন

date +'%Y-%m-%d %H:%M:%S' -d "@timestamp"

অন্যান্য উপায়ে: তারিখ -১৫ "@ 1585667718" + '% Y-% m-% d% H:% M:% S'
AndiAna

3

আমি একটি স্ক্রিপ্ট লিখেছি যা এটি নিজে করে:

#!/bin/bash
LANG=C
if [ -z "$1" ]; then
    if [  "$(tty)" = "not a tty" ]; then
            p=`cat`;
    else
            echo "No timestamp given."
            exit
    fi
else
    p=$1
fi
echo $p | gawk '{ print strftime("%c", $0); }'

1
আপনার প্রশ্ন ট্যাগগুলিতে "বাশ" অন্তর্ভুক্ত রয়েছে তবে আপনার শেবাং "sh" বলে।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

3

এই উত্তরে আমি ডেনিস উইলিয়ামসনের উত্তরটি অনুলিপি করেছি এবং স্ক্রিপ্টে অনেক টাইমস্ট্যাম্পগুলির একটি কলামটি পাইপ করার সময় বিস্তৃত গতি বাড়ানোর জন্য এটি সামান্য পরিবর্তন করেছি ify উদাহরণস্বরূপ, আমার মেশিনে xargs -n1 দিয়ে মূল স্ক্রিপ্টে 1000 টি টাইমস্ট্যাম্পগুলি পাইপ করা এই পরিবর্তিত সংস্করণটির সাথে 0.027 এর বিপরীতে 6.929s নিয়েছিল:

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        cat - | gawk '{ print strftime("%c", $1); }'
    else
        echo "No timestamp given." >&2
        exit
    fi
else
    date -d @$1 +%c
fi

2

কিছু উদাহরণ:

। তারিখ
মঙ্গলবার 22 16:47:06 সিএসটি 2016

$ তারিখ -d "মঙ্গলবার 22 মার্চ 16:47:06 সিএসটি 2016" "+% s"
1458636426

$ তারিখ +% s
1458636453

$ তারিখ -d @ 1458636426
মঙ্গলবার 22 16:47:06 সিএসটি 2016

$ তারিখ - তারিখ = '@ 1458636426'
মঙ্গলবার 22 16:47:06 সিএসটি 2016



2

আমি এই ক্রস প্ল্যাটফর্মটি ওয়ান-লাইনার ব্যবহার করি:

date -d @1267619929 2>/dev/null || date -r 1267619929

এটি উভয় ম্যাকোস এবং সাধারণ লিনাক্স বিতরণের পরবর্তী সংস্করণগুলিতে কাজ করা উচিত।


0

খাঁটি বাশ নয়, নিম্নলিখিত স্ক্রিপ্টটি পার্ল ব্যবহার করে আপনার স্থানীয় সময় অঞ্চলে একটি স্ট্রিংয়ে 13 দৈর্ঘ্যের টাইমস্ট্যাম্পগুলিকে তাদের সমতুল্য তারিখে রূপান্তর করবে

timestamp_to_date.sh

#!/usr/bin/env bash
IT=$(cat /dev/stdin)
re='(.*)([0-9]{13})(.*)'
while [[ $IT =~ $re ]]; do
  TIMESTAMP=${BASH_REMATCH[2]}
  AS_DATE=$(echo "$TIMESTAMP" | perl -pe 's/([\d]{10})([\d]{3})/localtime $1/eg;')
  IT="${IT/$TIMESTAMP/$AS_DATE}"    
done
echo "$IT"

ইনপুট

{"timestamp":"1573121629939","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}

আউটপুট

$ cat input | timestamp_to_date.sh

{"timestamp":"Thu Nov  7 06:13:49 2019","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}

-8

পিএইচপি-তে

$unix_time = 1256571985;

echo date("Y-m-d H:i:s",$unix_time)

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