2012-12-30 32 views
10

Go in thời gian vớiParse Go tem thời gian sử dụng Go

time.Now().String() 

như

2012-12-18 06:09:18.6155554 +0200 FLEST 

hoặc

2009-11-10 23:00:00 +0000 UTC 

http://play.golang.org/p/8qwq9U_Ri5

Làm thế nào để phân tích nó?

Tôi đoán FLESTFinland Latvian Estonian Standard Time Tôi không ở các quốc gia này và tôi đoán tôi có thể nhận được tất cả các loại múi giờ. tôi không thể tìm thấy một cách thống nhất hoặc mẫu để phân tích nó với time.Parse

+0

Tôi đã nghĩ rằng đó là lỗi khi di chuyển. Đi bao gồm một tập tin 'lib/time/zoneinfo.zip' mà" bao gồm "rất nhiều múi giờ, nhưng không phải là FLEST. Nhưng sau đó tôi tự hỏi tại sao FLEST đã được in ở nơi đầu tiên ... – topskip

+0

PC Windows 7 của tôi in FLEST múi giờ trong tệp nhật ký và cùng một PC không thể phân tích cú pháp vùng đó? – Max

Trả lời

10
package main 

import (
"fmt" 
"time" 
) 

func main() { 
    fmt.Println(time.Now()) 
    date := "2009-11-10 23:00:00 +0000 UTC" 
    t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", date) 
     if err != nil { 
       fmt.Println("parse error", err.Error()) 
     } 
     fmt.Println(t.Format(time.ANSIC)) 
} 

Playground: http://play.golang.org/p/hvqBgtesLd

Xem mã nguồn tại http://golang.org/src/pkg/time/format.go?s=15404:15450#L607

+0

Nó phân tích ngày thứ hai nhưng không phải là ngày đầu tiên. http://play.golang.org/p/ekR_xIM2Pf – Max

+0

@Max bạn nói đúng, tất nhiên. Lấy làm tiếc. – topskip

12

Mặc dù time.Parse() chấp nhận một chuỗi định dạng như 2006-01-02 15:04:05 -0700 MST, nó có thể đơn giản hơn để sử dụng một trong số constants được xác định trong thời gian.

const (
    ANSIC  = "Mon Jan _2 15:04:05 2006" 
    UnixDate = "Mon Jan _2 15:04:05 MST 2006" 
    RubyDate = "Mon Jan 02 15:04:05 -0700 2006" 
    RFC822  = "02 Jan 06 15:04 MST" 
    RFC822Z  = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone 
    RFC850  = "Monday, 02-Jan-06 15:04:05 MST" 
    RFC1123  = "Mon, 02 Jan 2006 15:04:05 MST" 
    RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone 
    RFC3339  = "2006-01-02T15:04:05Z07:00" 
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00" 
    Kitchen  = "3:04PM" 
    // Handy time stamps. 
    Stamp  = "Jan _2 15:04:05" 
    StampMilli = "Jan _2 15:04:05.000" 
    StampMicro = "Jan _2 15:04:05.000000" 
    StampNano = "Jan _2 15:04:05.000000000" 
) 

Edit: Nếu bạn đang sử dụng chuỗi như là một cách để lưu trữ hoặc thời gian mã hóa, (chẳng hạn như với một định dạng mã hóa hạn chế,), bạn có thể muốn xem xét sử dụng Unix time. Bằng cách đó, bạn chỉ có thể lưu trữ một số int64 (hoặc hai, nếu bạn giữ số giây nano.

+0

Không có gì không hoạt động để phân tích cú pháp '" 2012-12-18 06: 09: 18.6155554 +0200 FLEST "' - 'phân tích cú pháp lỗi phân tích cú pháp" 2012-12-18 06: 09: 18.6155554 +0200 FLEST "as" 2006-01 -02 15:04:05 -0700 MST ": không thể phân tích cú pháp" FLEST "là" MST "' – Max

5

Tài liệu cho time.String cung cấp định dạng: "2006-01-02 15: 04: 05.999999999 -0700 MST ". Bắt đầu sẽ sử dụng cùng một định dạng để phân tích cú pháp.

Múi giờ có thể là một vấn đề đối với bạn. Nếu bạn phải phân tích cú pháp thời gian mà bạn biết được tạo ra theo thời gian.String, nhưng được tạo trong thời gian khác Nếu bạn không thể lấy được zoneinfo, không thể cài đặt nó trên hệ thống của bạn, hoặc không thể có nguy cơ thất bại trên một số múi giờ mới chưa biết, thì định dạng time.String không phải dành cho bạn, bạn sẽ phải nhận tem thời gian ở định dạng khác hoặc xóa thời gian vùng từ các chuỗi và phân tích các chuỗi đã sửa đổi với định dạng được sửa đổi.

+0

Nó không hoạt động hoặc http://play.golang.org/p/xXJnS1dLIc – Max

+0

Hóa ra có lỗi trong 1.0 .3 hiện đã được sửa ở đầu giữ cho định dạng .999 hoạt động. Vấn đề của bạn với FLEST là riêng biệt. Tôi khuyên bạn nên xóa múi giờ khỏi phần cuối của chuỗi như tôi đã đề cập. Có lẽ tôi sẽ xử lý lỗi bằng cách tìm kiếm tên khu vực "FLEST" trong thông báo lỗi và nếu tìm thấy, sau đó reparse với tên khu vực bị loại bỏ khỏi cả chuỗi và định dạng. – Sonia