วิธีแยกวิเคราะห์การประทับเวลายูนิกซ์เป็นเวลาเวลา


126

ฉันกำลังพยายามแยกวิเคราะห์การประทับเวลา Unix แต่ฉันพบข้อผิดพลาดนอกช่วง นั่นไม่สมเหตุสมผลสำหรับฉันเพราะเค้าโครงถูกต้อง (เช่นเดียวกับในเอกสาร Go):

package main

import "fmt"
import "time"

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

    fmt.Println(tm)
}

สนามเด็กเล่น

คำตอบ:


239

time.Parseฟังก์ชั่นไม่ได้ทำ timestamps ยูนิกซ์ แต่คุณสามารถใช้strconv.ParseIntเพื่อแยกวิเคราะห์สตริงint64และสร้างการประทับเวลาด้วย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)
}

เอาท์พุท:

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

สนามเด็กเล่น: http://play.golang.org/p/v_j6UIro7a

แก้ไข:

เปลี่ยนจากstrconv.Atoiเป็นstrconv.ParseIntเพื่อหลีกเลี่ยงการล้น int บนระบบ 32 บิต


1
มีความคิดว่าเหตุใดจึงไม่มีการอ้างอิงในเอกสารนี้ พวกเขายังให้เค้าโครงการประทับเวลาของยูนิกซ์เป็นตัวอย่างเค้าโครง
เฮ้

ฉันเดาว่าเป็นเพราะการประทับเวลาแบบยูนิกซ์ไม่จำเป็นต้องมีการแยกวิเคราะห์เนื่องจากไม่ใช่การแสดงข้อความ แต่เป็นการแสดงเวลาเป็นจำนวนเต็ม คุณเพิ่งเกิดการแสดงสตริงของค่าจำนวนเต็ม และการกล่าวถึง 1136239445 ในเอกสารอาจเป็นเพียงการชี้แจงว่าจะใช้การประทับเวลาที่แน่นอนใดเป็นเวลาอ้างอิงไม่ใช่ว่าจะใช้เป็นเค้าโครง
ANisus

4
จะดีกว่าไหมถ้าใช้strconv.ParseUintแทนเพราะจำนวนลบก็ไม่สมเหตุสมผลอยู่ดี
Atmocreations

6
@Atmocreations: func Unix(sec int64, nsec int64) Timeได้รับint64ค่า นอกจากนี้จำนวนลบสำหรับวินาทีก็สมเหตุสมผลดี - พวกเขาอธิบายวันที่ก่อนปี 1970! :) สำหรับnsecค่าลบหมายถึงการลบจำนวนนาโนวินาทีนั้นออกจากวินาที
ANisus

1
ฉันต้องการเพียงวันที่และเวลาเป็น "2014-07-16 20:55:46" จะทำได้อย่างไร?
karthik

14

คุณสามารถใช้เวลาได้โดยตรงฟังก์ชัน Unix ของเวลาซึ่งจะแปลงการประทับเวลาแบบยูนิกซ์เป็น 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)
}

เอาท์พุต

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

ตรวจสอบใน Go Playground: https://play.golang.org/p/5FtRdnkxAd


4

การแบ่งปันฟังก์ชั่นบางอย่างที่ฉันสร้างขึ้นสำหรับวันที่:

โปรดทราบว่าฉันต้องการหาเวลาสำหรับสถานที่หนึ่ง ๆ (ไม่ใช่เฉพาะเวลา UTC) หากคุณต้องการเวลา UTC เพียงแค่ลบตัวแปร loc และการเรียกฟังก์ชัน. 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")
}

ถอดให้ฉันในเวลาที่.In(loc) -0400 EDTแทนที่ด้วย.In(time.UTC)ทำให้ฉันมีเวลาใน UTC
NatoBoram

3

ตามเอกสาร go Unix ส่งคืนเวลาท้องถิ่น

Unix ส่งคืนเวลาท้องถิ่นที่ตรงกับเวลา Unix ที่กำหนด

ซึ่งหมายความว่าผลลัพธ์จะขึ้นอยู่กับเครื่องที่รหัสของคุณทำงานซึ่งส่วนใหญ่มักเป็นสิ่งที่คุณต้องการ แต่บางครั้งคุณอาจต้องการให้มีค่าเป็น UTC

ในการทำเช่นนั้นฉันปรับตัวอย่างข้อมูลเพื่อให้ส่งคืนเวลาเป็น UTC:

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

สิ่งนี้พิมพ์บนเครื่องของฉัน (ใน CEST)

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

0

ฉันทำการบันทึกจำนวนมากโดยที่การประทับเวลาเป็น float64 และใช้ฟังก์ชันนี้เพื่อรับการประทับเวลาเป็นสตริง:

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

เพียงแค่ใช้เวลา

ตัวอย่าง:

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())
}

การทำงานตัวอย่างเช่นในplay.golang.org


2
คำถามระบุการประทับเวลายูนิกซ์ คำตอบนี้ไม่ได้กล่าวถึงแง่มุมนั้น
t3h2mas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.