Cách phân tích cú pháp unix timestamp thành time.Time


126

Tôi đang cố gắng phân tích cú pháp một dấu thời gian Unix nhưng tôi gặp lỗi ngoài phạm vi. Điều đó không thực sự có ý nghĩa đối với tôi, bởi vì bố cục chính xác (như trong tài liệu Go):

package main

import "fmt"
import "time"

func main() {
    tm, err := time.Parse("1136239445", "1405544146")
    if err != nil{
        panic(err)
    }

    fmt.Println(tm)
}

Sân chơi

Câu trả lời:


239

Các time.Parsechức năng không làm timestamps Unix. Thay vào đó, bạn có thể sử dụng strconv.ParseIntđể phân tích cú pháp chuỗi int64và tạo dấu thời gian bằng time.Unix:

package main

import (
    "fmt"
    "time"
    "strconv"
)

func main() {
    i, err := strconv.ParseInt("1405544146", 10, 64)
    if err != nil {
        panic(err)
    }
    tm := time.Unix(i, 0)
    fmt.Println(tm)
}

Đầu ra:

2014-07-16 20:55:46 +0000 UTC

Sân chơi: http://play.golang.org/p/v_j6UIro7a

Biên tập:

Đã thay đổi từ strconv.Atoithành strconv.ParseIntđể tránh tràn int trên hệ thống 32 bit.


1
Bất kỳ ý tưởng tại sao không có tài liệu tham khảo như vậy trong tài liệu? Họ thậm chí còn cung cấp bố cục sơ đồ thời gian unix làm ví dụ về bố cục.
hey

Tôi đoán đó là vì dấu thời gian unix không yêu cầu phân tích cú pháp vì nó không phải là biểu diễn văn bản, mà là biểu diễn số nguyên của thời gian. Bạn vừa xảy ra một biểu diễn chuỗi của một giá trị số nguyên. Và việc đề cập đến 1136239445 trong tài liệu có lẽ chỉ để làm rõ dấu thời gian chính xác nào được sử dụng làm thời gian tham chiếu, không phải là nó được sử dụng làm bố cục.
ANisus

4
Sẽ tốt hơn nếu sử dụng strconv.ParseUintthay thế vì số âm dù sao cũng không có ý nghĩa?
Atmocreations

6
@Atmocreations: func Unix(sec int64, nsec int64) Timenhận int64giá trị. Ngoài ra, số âm cho giây có ý nghĩa hoàn hảo - chúng mô tả các ngày trước năm 1970! :) Đối với nsec, giá trị âm có nghĩa là loại bỏ nhiều nano giây đó khỏi giây.
ANisus

1
Tôi chỉ muốn ngày và giờ là "2014-07-16 20:55:46" làm sao đạt được?
karthik

14

Bạn có thể sử dụng trực tiếp hàm time.Unix của thời gian chuyển đổi tem thời gian unix thành UTC

package main

import (
  "fmt"
  "time"
)


func main() {
    unixTimeUTC:=time.Unix(1405544146, 0) //gives unix time stamp in utc 

    unitTimeInRFC3339 :=unixTimeUTC.Format(time.RFC3339) // converts utc time to RFC3339 format

    fmt.Println("unix time stamp in UTC :--->",unixTimeUTC)
    fmt.Println("unix time stamp in unitTimeInRFC3339 format :->",unitTimeInRFC3339)
}

Đầu ra

unix time stamp in UTC :---> 2014-07-16 20:55:46 +0000 UTC
unix time stamp in unitTimeInRFC3339 format :----> 2014-07-16T20:55:46Z

Đăng ký Go Playground: https://play.golang.org/p/5FtRdnkxAd


4

Chia sẻ một vài hàm mà tôi đã tạo cho các ngày tháng:

Xin lưu ý rằng tôi muốn có thời gian cho một vị trí cụ thể (không chỉ theo giờ UTC). Nếu bạn muốn thời gian UTC, chỉ cần loại bỏ biến loc và lệnh gọi hàm .In (loc).

func GetTimeStamp() string {
     loc, _ := time.LoadLocation("America/Los_Angeles")
     t := time.Now().In(loc)
     return t.Format("20060102150405")
}
func GetTodaysDate() string {
    loc, _ := time.LoadLocation("America/Los_Angeles")
    current_time := time.Now().In(loc)
    return current_time.Format("2006-01-02")
}

func GetTodaysDateTime() string {
    loc, _ := time.LoadLocation("America/Los_Angeles")
    current_time := time.Now().In(loc)
    return current_time.Format("2006-01-02 15:04:05")
}

func GetTodaysDateTimeFormatted() string {
    loc, _ := time.LoadLocation("America/Los_Angeles")
    current_time := time.Now().In(loc)
    return current_time.Format("Jan 2, 2006 at 3:04 PM")
}

func GetTimeStampFromDate(dtformat string) string {
    form := "Jan 2, 2006 at 3:04 PM"
    t2, _ := time.Parse(form, dtformat)
    return t2.Format("20060102150405")
}

Xóa .In(loc)đã cho tôi thời gian -0400 EDT. Thay thế nó bằng .In(time.UTC)đã cho tôi thời gian ở UTC.
NatoBoram

3

Theo tài liệu go , Unix trả về thời gian cục bộ.

Unix trả về Giờ cục bộ tương ứng với thời gian Unix nhất định

Điều này có nghĩa là đầu ra sẽ phụ thuộc vào máy mà mã của bạn chạy trên đó, thường là những gì bạn cần, nhưng đôi khi, bạn có thể muốn có giá trị theo giờ UTC.

Để làm như vậy, tôi đã điều chỉnh đoạn mã để làm cho đoạn mã quay trở lại thời gian theo giờ UTC:

i, err := strconv.ParseInt("1405544146", 10, 64)
if err != nil {
    panic(err)
}
tm := time.Unix(i, 0)
fmt.Println(tm.UTC())

Bản này in trên máy của tôi (trong CEST)

2014-07-16 20:55:46 +0000 UTC

0

Tôi thực hiện rất nhiều ghi nhật ký trong đó dấu thời gian là float64 và sử dụng hàm này để lấy dấu thời gian dưới dạng chuỗi:

func dateFormat(layout string, d float64) string{
    intTime := int64(d)
    t := time.Unix(intTime, 0)
    if layout == "" {
        layout = "2006-01-02 15:04:05"
    }
    return t.Format(layout)
}

-6

Chỉ cần sử dụng thời gian.

thí dụ:

package main

import (
    "fmt"
    "time"
)

func main() {
    fromString := "Wed, 6 Sep 2017 10:43:01 +0300"
    t, e := time.Parse("Mon, _2 Jan 2006 15:04:05 -0700", fromString)
    if e != nil {
        fmt.Printf("err: %s\n", e)
    }
    fmt.Printf("UTC time: %v\n", t.UTC())
}

Ví dụ làm việc trên play.golang.org .


2
Câu hỏi chỉ định một dấu thời gian unix. Câu trả lời này không giải quyết khía cạnh đó.
t3h2mas 21/02/18
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.