it-swarm-vi.com

Làm cách nào tôi có thể nhận được một ngày được định dạng cho dấu thời gian UNIX từ dòng lệnh

Tôi có dấu thời gian UNIX và tôi muốn có một ngày được định dạng (như đầu ra của date) tương ứng với dấu thời gian đó.

Những nỗ lực của tôi cho đến nay:

$ date +%s
1282367908
$ date -d 1282367908
date: invalid date `1282367908'
$ date -d +1282367908
date: invalid date `+1282367908'
$ date +%s -d +1282367908
date: invalid date `+1282367908'

Tôi muốn có thể có được đầu ra như:

$ TZ=UTC somecommand 1282368345
Sat Aug 21 05:25:45 UTC 2010
63
Umang

Trên Mac OS X và BSD:

$ date -r 1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -r 1282368345 +%Y-%m-%d
2010-08-21

với GNU công cụ cốt lõi (bạn phải đào qua tệp thông tin cho điều đó):

$ date -d @1282368345
Sat Aug 21 07:25:45 CEST 2010
$ date -d @1282368345 --rfc-3339=date
2010-08-21

Với một trong hai, thêm -u (tiêu chuẩn) tùy chọn hoặc vượt qua TZ=UTC0 biến môi trường để có ngày UTC (TZ=UTC0định nghĩa một múi giờ được gọi là UTC với độ lệch 0 từ UTC trong khi hành vi cho TZ=UTC (không có bù) là không xác định (mặc dù trên hầu hết các hệ thống sẽ đề cập đến múi giờ do hệ thống xác định còn được gọi là UTC với offset 0 từ UTC)).

98
user601

Perl one-liner này sẽ làm điều đó:

$ Perl -e 'print scalar localtime $ARGV[0]' 1282367908
Sat Aug 21 09:18:28 2010
6
AlexD

Sau một vài lần googling, tôi đã tìm ra cách để làm điều đó chỉ bằng lệnh date:

$ date --date "Jan 1, 1970 00:00:00 +0000 + 1282367908 seconds"
Sat Aug 21 09:18:28 MSD 2010
6
AlexD

Với các nội dung Shell:

  • zsh (4.1.1 (2003) trở lên):

    $ zmodload zsh/datetime
    $ TZ=UTC0 strftime %c 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    
  • ksh93 (ksh93i (2000) trở lên):

    $ TZ=UTC0 printf '%(%c)T\n' '#1282368345'
    Sat Aug 21 05:25:45 2010
    
  • bash (4.2 (2010) trở lên):

    $ TZ=UTC0 printf '%(%c)T\n' 1282368345
    Sat 21 Aug 2010 05:25:45 UTC
    

Trong tất cả những thứ đó, thay thế %c Bằng định dạng strftime() bạn muốn.

5
Stéphane Chazelas

Trả lời một câu hỏi cũ, nhưng tôi nghĩ rằng đây có thể là một sự cải thiện nếu có ai khác tìm kiếm nó. Hàm Bash này hoạt động trên cả Linux và OS X. Tôi chưa thử nghiệm trên bất kỳ hệ thống BSD nào khác. Truyền thời gian Epoch làm đối số cho hàm này và nó sẽ in định dạng thời gian RFC-3339.

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    Epoch=$(echo [email protected] | sed -n "s/.*\([0-9]\{10\}\).*/\1/p");
    if date --version >/dev/null 2>/dev/null; then
        # Linux
        date ${RFC3339_FORMAT} -d "1970-01-01 UTC ${Epoch} seconds"
        #date -d @${Epoch} --rfc-3339=seconds
    else
        # OS X/BSD
        date -r ${Epoch} ${RFC3339_FORMAT}
    fi
}
2
Noah Spurrier

Trên osx, để có trong UTC

date -r "1475737200" -u
2
anyone

Một ví dụ khác về di sản phong phú của Unix hiện đại. Điều này thực sự có thể xảy ra với hầu hết các biến thể BSD:

$ TZ=UTC date -r 1282368345
Sat Aug 21 05:25:45 UTC 2010

(BTW ví dụ của bạn dường như bị tắt trong một giây)

1
codehead