Lấy Dấu thời gian Unix bằng Ngôn ngữ Go (thời gian hiện tại tính bằng giây kể từ kỷ nguyên)


84

Tôi có một số mã được viết bằng Go mà tôi đang cố gắng cập nhật để làm việc với các bản dựng hàng tuần mới nhất. (Nó được chế tạo lần cuối dưới r60). Mọi thứ hiện đang hoạt động ngoại trừ bit sau:

 if t, _, err := os.Time(); err == nil {
   port[5] = int32(t)
 }

Bất kỳ lời khuyên nào về cách cập nhật điều này để hoạt động với việc triển khai cờ vây hiện tại?

Câu trả lời:


166
import "time"
...
port[5] = int32(time.Now().Unix())

41
CẢNH BÁO: Unix()Giá trị trả về là kiểu int64. Việc cắt bớt int64giá trị kiểu cần nhập int32là một ví dụ của vấn đề Năm 2038 .
peterSO

1
go1.9.2 darwin / amd64, điều này liên tục trả về: 1969-12-31 19:00:00, gần tương đương với: time.Unix (0, 0). Điều này không có sự cắt ngắn.
Breedly

31

Nếu bạn muốn nó stringchỉ cần chuyển đổi nó qua strconv:

package main

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

func main() {
    timestamp := strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
    fmt.Println(timestamp) // prints: 1436773875771421417
}

điểm của việc này là gì? Nếu ai đó muốn chuyển một số thành chuỗi, anh ta có thể tìm cách thực hiện việc này. Hoặc có thể tôi chỉ nên thêm một câu trả lời khác: nếu bạn muốn chuyển đổi nó thành một bytearray, chỉ cần thực hiện [] byte (...)?
Salvador Dali

11
@SalvadorDali Thực ra đây chính là thứ tôi cần. Hãy tiếp tục và thêm câu trả lời của bạn để chuyển đổi nó thành một mảng byte nếu bạn muốn, tôi chắc chắn rằng cuối cùng sẽ có người đến và cần mã.
anon58192932

3
time.Now (). UTC (). UnixNano () có thể được thay thế bằng time.Now (). UnixNano () - tài liệu nói rằng kết quả không phụ thuộc vào vị trí liên kết với t.
Abu Junayd

16

Một mẹo khác. time.Now().UnixNano()(godoc) sẽ cung cấp cho bạn nano giây kể từ kỷ nguyên. Đó không phải là thời gian Unix hoàn toàn, nhưng nó mang lại cho bạn độ chính xác thứ hai bằng cách sử dụng cùng một kỷ nguyên, điều này có thể hữu ích.

Chỉnh sửa: Đã thay đổi để phù hợp với api golang hiện tại


1
Tôi biết tôi đang phục hồi một chuỗi cũ, nhưng tôi tự hỏi ... Python rõ ràng đang ghi lại các vấn đề mà nó gặp phải với việc có được thời gian chính xác trên các nền tảng khác nhau. Xem docs.python.org/2/library/time.html và tìm kiếm "độ chính xác". Vấn đề là: không phải vì bạn có float64 mà tất cả các số thập phân đều có ý nghĩa. Thời gian của cờ vây được triển khai như thế nào, tôi có thể tin tưởng độ chính xác nano giây này là bao nhiêu?
Niriel

5
Điều đó không hoạt động ở đây, nhưng time.Now().UnixNano()( tham chiếu ) thì có.
Jo Liss

0

Xây dựng ý tưởng từ một câu trả lời khác ở đây, để có được cách diễn giải mà con người có thể đọc được, bạn có thể sử dụng:

package main

import (
    "fmt"
    "time"
)

func main() {
    timestamp := time.Unix(time.Now().Unix(), 0)
    fmt.Printf("%v", timestamp) // prints: 2009-11-10 23:00:00 +0000 UTC
}

Hãy thử nó trong The Go Playground .

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.