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


59

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

Câu trả lời:


92

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 các công cụ cốt lõi GNU (bạn phải tìm hiểu tệp thông tin cho việc đó):

$ 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 -utùy chọn (tiêu chuẩn) hoặc vượt qua TZ=UTC0biến môi trường để có ngày UTC ( TZ=UTC0 xác định múi giờ được gọi UTCvới offset 0 từ UTC trong khi hành vi cho TZ=UTC(không có bù) không được chỉ đị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ũng được gọi UTCvới offset 0 từ UTC)).


1
Tuy nhiên, phải mất rất nhiều công việc đào bới, điều đáng ngạc nhiên cho một nhiệm vụ chung như vậy.
David Z

Cảm ơn, chấp nhận câu trả lời của bạn. Tôi nên đọc info coreutils datekỹ hơn một chút.
Umang

Điều này mang lại cho tôi một ngày hơi khác: date -r 1447264553943kết quả là Wed Dec 28 01:39:03 BRST 47831khi nó thực sự 11/11/2015, 3:55:53 PM GMT-2:00.
falmp

1
@falmp: nó sẽ hoạt động nếu bạn sử dụng giây thay vì micro giây.

@hop ops, lẽ ra phải tìm ra năm 47831, nhưng con số đó quá cao nên tôi đã bỏ lỡ nó. Cảm ơn!
falmp

6

Sau một vài lần googling, tôi chỉ tìm cách làm điều đó với datelệnh:

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

Cảm ơn vì điều đó. Tôi đã hy vọng sẽ có một cái gì đó đơn giản hơn, vì vậy bây giờ chỉ cần bỏ phiếu.
Umang

một ví dụ tuyệt vời khác về cách google làm cho bạn ngu ngốc. không ai đọc tài liệu này nữa?

1
@hop, hỗ trợ date -d @xxxkhông được thêm cho đến khi coreutils 5.3 vào năm 2005. Đó là cách bạn phải làm điều đó trước đó.
Stéphane Chazelas

@ StéphaneChazelas: a) câu trả lời này là từ năm 2010 và b) tại sao lý do này lại googling trước khi đọc tài liệu? Nếu bạn trả lời từ chính quyền của mình, người ta có thể tha thứ cho những lỗi như thế này, nhưng nếu bạn phải tìm kiếm nó bằng mọi giá, hãy tìm kiếm nó ngay.

@hop, tôi chỉ chỉ ra rằng đó không phải là một câu trả lời ngu ngốc, chỉ là một câu trả lời lỗi thời.
Stéphane Chazelas

6

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

5

Với các nội dung vỏ:

  • 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 người, thay thế %cbằng strftime()định dạng bạn muốn.


Bạn có một tài liệu tham khảo cho các bash printfgiải pháp?
Derek Mahar

Không bao giờ, tôi đã tìm thấy nó trong phần mô tả printftrong gnu.org/software/bash/manual/bashref.html#Bash-Builtins .
Derek Mahar

2

Trên osx, để có trong UTC

date -r "1475737200" -u

Cảm ơn. Tôi đã chỉnh sửa rằng trong câu trả lời được chấp nhận để thông tin có sẵn hơn.
Stéphane Chazelas

1

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)


Không hoạt động trên Linux. câu trả lời của hop dường như có câu trả lời đúng của Linux. Cảm ơn đã chỉ ra rằng, tôi đã nghi ngờ điều gì đó sẽ xảy ra, tôi đã thực hiện được 45 giây rồi.
Umang

1

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 kỷ nguyên làm đối số cho chức năng này và nó sẽ in định dạng thời gian RFC-3339.

epochtorfc3339 ()
{
    RFC3339_FORMAT="+%FT%T:::%z"
    EPOCH=$(echo $@ | 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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.