2010-03-03 46 views

Trả lời

356

Trong các phiên bản sau này của bản phân phối Linux phổ biến bạn có thể sử dụng:

date -d @1267619929 
+2

Một lớp lót: 'ngày -d @ $ (ngày -u +% s)' –

+16

'@' là gì? Tôi không thấy điều đó trong trang GNU man chút nào. –

+8

@mehaase - trang người đàn ông lưu ý rằng chuỗi ngày quá phức tạp để được ghi lại trong manpage, vì vậy nó được mô tả trong thông tin: ** info '(coreutils) date invocation' ** – MByD

2

Tôi đã viết một kịch bản mà thực hiện điều này bản thân mình:

#!/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

Thẻ câu hỏi của bạn bao gồm "bash", nhưng shebang của bạn nói "sh". –

+0

Cảm ơn, đã sửa nó. – chiborg

-7

Trong PHP

$unix_time = 1256571985; 

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

Đẹp, nhưng tôi chỉ muốn sử dụng bash. – chiborg

9

Bạn có thể sử dụng kịch bản này awk đơn giản:

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

sử dụng mẫu:

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

Điều này không phù hợp với việc sử dụng đầu tiên - đôi khi tôi không muốn lặp lại TS và sử dụng tham số thay thế. – chiborg

+0

Trên một số phiên bản busybox cũ, 'date -s @' không hoạt động, và 'awk' vẫn hoạt động! Một ví dụ mà không có một stdin sẽ là hữu ích quá. –

10

Bạn có thể sử dụng ngày GNU, ví dụ,

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

hoặc

$ date -ud @1267619929 
23

Phiên bản này cũng tương tự như câu trả lời của chiborg, nhưng nó giúp loại bỏ sự cần thiết của bên ngoài ttycat. Nó sử dụng date, nhưng có thể dễ dàng sử dụng gawk. Bạn có thể thay đổi shebang và thay thế các dấu ngoặc vuông kép bằng những dấu ngoặc đơn và điều này cũng sẽ chạy trong 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 
+0

+1: câu trả lời rất hoàn chỉnh và tôi nghĩ ngày tháng nhanh hơn gawk. –

+0

@Bruno, làm thế nào để bạn biết ngày là nhanh hơn so với chim ưng.? – ghostdog74

+3

@Bruno, @ ghostdog74: Trên hệ thống của tôi, 'gawk' là (rất gần) nhanh hơn 15% so với' ngày' trong một vòng lặp 'for' được định thời chỉ bao gồm' gawk 'BEGIN {print strftime ("% c", 1256571985); } ''hoặc' date -d' @ 1256571985 '+% c' với đầu ra được chuyển hướng đến '/ dev/null'. –

116
date -r <number> 

công trình đối với tôi trên Mac   OS   X.

+3

Có, nhưng nó không xử lý các phân số của một giây. – mgold

+1

Và nó gây nhầm lẫn vì nó không hoạt động theo cách đó trên hầu hết các hệ thống linux, bởi vì: freddy @ hades ~% date --help | grep - -r -r, --reference = FILE hiển thị thời gian sửa đổi cuối cùng của FILE – frank42

4

tôi sử dụng này khi chuyển đổi các file log hoặc giám sát họ:

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

Trong câu trả lời này, tôi sao chép câu trả lời Dennis Williamson và sửa đổi nó một chút để cho phép tăng tốc độ lớn khi chuyển một cột của nhiều dấu thời gian đến tập lệnh. Ví dụ, đường ống 1000 timestamps để kịch bản ban đầu với xargs -n1 trên máy tính của tôi mất 6.929s như trái ngược với 0.027s với phiên bản sửa đổi này:

#!/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 
0

một số ví dụ:

 
$ date 
Tue Mar 22 16:47:06 CST 2016 

$ date -d "Tue Mar 22 16:47:06 CST 2016" "+%s" 
1458636426 

$ date +%s 
1458636453 

$ date -d @1458636426 
Tue Mar 22 16:47:06 CST 2016 

$ date --date='@1458636426' 
Tue Mar 22 16:47:06 CST 2016 


1

Từ Bash 4.2 bạn có thể sử dụng định dạng %(datefmt)Tprintf 's:

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

đó là tốt đẹp, bởi vì đó là một BUILTIN vỏ.Định dạng cho datefmt là một chuỗi được chấp nhận bởi strftime(3) (xem man 3 strftime). Dưới đây %c là:

%c Ngày ưa thích và biểu diễn thời gian cho các locale hiện hành.


Bây giờ nếu bạn muốn có một kịch bản mà chấp nhận một cuộc tranh cãi, và nếu không được cung cấp, đọc stdin, bạn có thể tiến hành như:

#!/bin/bash 

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

Trong OSX, hoặc BSD, có một tương đương -r cờ dường như có dấu thời gian unix. Dưới đây là một ví dụ chạy ngày bốn lần: một lần cho ngày đầu tiên, để hiển thị nó là gì; một để chuyển đổi sang dấu thời gian unix với %s và cuối cùng, một trong đó, với -r, chuyển đổi những gì %s cung cấp trở lại chuỗi.

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

Ít nhất, có vẻ như hoạt động trên máy của tôi.

$ 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 
+0

Nếu bạn đã có giá trị dấu thời gian và bạn chỉ cần tìm ngày tương đương, trong OS X bạn chỉ có thể gõ lệnh này tại lệnh line: date -r 1509453417 –

+0

Đó là sự thật. Nếu bạn nhìn vào câu trả lời của tôi, tôi thực sự chứng minh điều đó. –

Các vấn đề liên quan