Go में पार्सिंग डेट स्ट्रिंग


138

मैंने "2014-09-12T11:45:26.371Z"गो में डेट स्ट्रिंग को पार्स करने की कोशिश की ।

कोड

layout := "2014-09-12T11:45:26.371Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout , str)

मुझे यह त्रुटि मिली:

पार्सिंग समय "2014-11-12T11: 47: 39.489Z": महीने की सीमा से बाहर

मैं इस दिनांक स्ट्रिंग को कैसे पार्स कर सकता हूं?


भविष्य के पाठकों के लिए, मैंने तिथि बढ़ाने के
सोनिया हैमिल्टन

आपका लेआउट वास्तव में 2006-01-02T15:04:05.000Zकुछ क्रेजी गो स्टैंडर्ड के कारण होना चाहिए
tharinduwijewardane

जवाबों:


164

यहाँ वर्णित सटीक लेआउट संख्या और यहाँ एक अच्छे ब्लॉगपोस्ट का उपयोग करें

इसलिए:

layout := "2006-01-02T15:04:05.000Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout, str)

if err != nil {
    fmt.Println(err)
}
fmt.Println(t)

देता है:

>> 2014-11-12 11:45:26.371 +0000 UTC

मुझे पता है। मन मारना। मुझे भी पहली बार पकड़ा। जाओ बस डेटाइम घटकों ( YYYY-MM-DD) के लिए एक अमूर्त वाक्यविन्यास का उपयोग नहीं करता है , लेकिन ये सटीक संख्याएं ( मुझे लगता है कि इस के अनुसार, पहले जाने का समय क्या है? क्या किसी को पता है?)।


118
लेआउट संख्या? क्या? क्यों? अरे!
डार्थ एग्रीगियस

29
वे क्या सोच रहे थे ! ? या धूम्रपान?
जिष्णु प्रताप

14
मुझे यहाँ टिप्पणियों में थोड़ी देर हो सकती है, लेकिन संख्याओं के साथ लेआउट से डरना नहीं चाहिए, बस स्थिरांक का उपयोग करें और आपका कोड साफ होगा :) उदा। समय। आरएफसी 3339
डेविड डायज़ेव

11
उन लोगों के लिए जो लेआउट नंबर प्राप्त नहीं करते हैं, मैं इसे पहली नज़र में बहुत विदेशी मानता हूं, लेकिन एक बार जब आप इसकी आदत डाल लेते हैं, तो मुझे लगता है कि यह कम से कम विशिष्ट लेआउट डिवाइसों के रूप में अधिक समझ में आता है ('क्या मैं "डी" का उपयोग करता हूं) "d", "dd", "DD", आदि?), और शायद अधिक समझदारी। आपको इसके बारे में पहले जानना होगा।
तीन

5
यह महामारी के उद्देश्य के लिए है, अर्थात, आपको सिर्फ 1, 2, 3, 4, 5, 6, 7 इन अक्षरों को याद रखना होगा। इस पर चर्चा करने वाला एक शानदार लेख है: medium.com/@simplyianm/…
amigcamel

85

उपयोग करने के लिए लेआउट वास्तव 2006-01-02T15:04:05.000Zमें रिका के उत्तर में वर्णित है ।
यह "जाने की पहली प्रतिबद्धता का समय" नहीं है, बल्कि याद रखने के लिए एक असामान्य तरीका है। Pkg / समय
देखें :

लेआउट में उपयोग किया जाने वाला संदर्भ समय है:

Mon Jan 2 15:04:05 MST 2006

जो यूनिक्स समय है 1136239445
चूंकि MST GMT-0700 है, इसलिए संदर्भ समय के बारे में सोचा जा सकता है

 01/02 03:04:05PM '06 -0700

(1,2,3,4,5,6,7, बशर्ते आपको याद हो कि 1 महीने के लिए है, और 2 दिन के लिए है, जो खुद की तरह यूरोपीय लोगों के लिए आसान नहीं है, इसका इस्तेमाल दिन-महीने की तारीख के प्रारूप के लिए किया जाता है)

के रूप में में सचित्र " : time.parse क्यों golang गलत तरीके से समय को पार्स करता है? कि लेआउट (1,2,3,4,5,6,7 का प्रयोग करके) सम्मान किया जाना चाहिए", वास्तव में


हाँ जो ऑस्ट्रेलियाई को भी कैच आउट करता है! MM / DD सिर्फ मेरे लिए गणना नहीं करता है और मुझे इसे देखते रहना है।
सिमोन व्हाइटहेड

3
@SimonWhitehead मैं सहमत हूँ। कम से कम, एक बार जब मैं इसे देखता हूं, तो मुझे पता है कि YY, MM, DD, hh, mm, ss किसलिए खड़े हैं और मैं उन्हें आसानी से ऑर्डर कर सकता हूं। गो के साथ, इसे देखने के बाद भी, मुझे यह याद रखना होगा कि 1, 2, 3, 4 ... क्या है।
वॉन सी सी

1
जिस तरह से मुझे यह याद है वह है: चरण 1) "उचित" तिथि क्रम वर्ष है> महीना> दिन> घंटा> मिनट> दूसरा> आदि (क्योंकि मिश्रित-एंडियन सिर्फ गैर-संवेदनात्मक रूप से मनमाना और असंगत होगा और तारीखों के लिए बड़ा- एंडियन छोटे-से-अधिक के लिए बेहतर है क्योंकि यह सॉर्ट-फ्रेंडली है।) इससे हमें 1 (वर्ष), 2 (महीना), 3 (दिन), [...] चरण 2) मिलेगा / Google अमेरिकी हैं और अमेरिकियों ने अपने उनकी तारीखों के अंत में वर्ष, इसलिए इसके बजाय यह 1 (महीना), 2 (दिन), [...], एन (वर्ष) चरण 3) समयक्षेत्र सब कुछ के बाद जाता है क्योंकि टाइमज़ोन एक अतिरिक्त अमूर्त परत है।
21

@mtraceur हां ... मुझे भी web.archive.org/web/20180501100155/http://… ( github.com/bdotdub/fuckinggodateformat से ) याद है । मेरा मतलब है, strftimeFTW।
VONC

58

जैसा कि उत्तर दिया गया है लेकिन "2006-01-02T15:04:05.000Z"लेआउट के लिए टाइपिंग को बचाने के लिए, आप पैकेज के निरंतर RFC3339 का उपयोग कर सकते हैं ।

str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(time.RFC3339, str)

if err != nil {
    fmt.Println(err)
}
fmt.Println(t)

https://play.golang.org/p/Dgu2ZvHwTh


1
इसके अतिरिक्त, यदि आप संकुल स्थिरांक को देखते हैं (ऊपर दिए गए उत्तर में जुड़ा हुआ) तो अन्य सामान्य स्वरूपों का एक समूह है, बशर्ते कि उनका उपयोग किया जा सके। यदि आपको कुछ अलग करने की आवश्यकता है, तो उन्हें शुरुआती बिंदु के रूप में उपयोग करें।
ह्यूग

यह और कई जवाब सुझाते हैं 2006-01-02T15:04:05.000Zऔर उल्लेख करते हैं कि गो का time.RFC3339काम भी होगा। लेकिन time.RFC3339 = "2006-01-02T15:04:05Z07:00"। क्या ये दो प्रारूप बिलकुल समान हैं जैसे कि क्या time.Parseऔर क्या time.ParseInLocationकरेंगे?
मील्स

1
यह सही है @ माइल्स, यह परीक्षण इसकी पुष्टि करता है। play.golang.org/p/T3dW1kTeAHl
23

24

मैं समय पैकेज से समय का उपयोग करने का सुझाव देता हूं। RFC3339 निरंतर। आप समय पैकेज से अन्य स्थिरांक की जांच कर सकते हैं। https://golang.org/pkg/time/#pkg-constants

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Time parsing");
    dateString := "2014-11-12T11:45:26.371Z"
    time1, err := time.Parse(time.RFC3339,dateString);
    if err!=nil {
    fmt.Println("Error while parsing date :", err);
    }
    fmt.Println(time1); 
}

क्या आपके पास अर्धविराम का उपयोग करने का मतलब है?
क्रिस्टोकिवी

20

यह पार्टी के लिए देर से है, और वास्तव में कुछ भी नहीं कह रहा है जो पहले से ही एक रूप या दूसरे में नहीं कहा गया है, ज्यादातर ऊपर दिए गए लिंक के माध्यम से, लेकिन मैं एक टीएल देना चाहता था; डीआर उन लोगों पर कम ध्यान देने की अवधि के लिए फिर से तैयार करना:

गो प्रारूप स्ट्रिंग की तारीख और समय बहुत महत्वपूर्ण है। यह जाना जाता है कि कौन सा क्षेत्र कौन सा है। वे आमतौर पर 1-9 बाएं से दाएं होते हैं:

  • जनवरी / जनवरी / जनवरी / जून / 01 / _1 (आदि) महीने के लिए हैं
  • 02 / _2 महीने के दिन के लिए हैं
  • 15/03 / _3 / PM / P / pm / p घंटे और मध्याह्न के लिए हैं (3pm)
  • 04 / _4 मिनट के लिए हैं
  • 05 / _5 सेकंड के लिए हैं
  • 2006/06 वर्ष के लिए हैं
  • -0700 / 07:00 / एमएसटी समयक्षेत्र के लिए हैं
  • .999999999 / .000000000 इत्यादि आंशिक सेकंड के लिए हैं (मुझे लगता है कि यदि अंतर शून्य को हटा दिया जाता है तो)
  • सोम / सोमवार सप्ताह का दिन है (जो कि 01-02-2006 वास्तव में था),

इसलिए, अपनी तिथि प्रारूप के रूप में "01-05-15" न लिखें, जब तक कि आप "महीना-दूसरा-घंटा" न चाहें

(... फिर, यह मूल रूप से ऊपर का सारांश था।)


5

यह सुपर लेट हो सकता है, लेकिन यह उन लोगों के लिए है जो इस समस्या पर ठोकर खा सकते हैं और पार्सिंग डेट स्ट्रिंग के लिए बाहरी पैकेज का उपयोग करना चाह सकते हैं।

मैंने एक पुस्तकालय की तलाश की है और मुझे यह मिल गया है:

https://github.com/araddon/dateparse

README से उदाहरण:

package main

import (
    "flag"
    "fmt"
    "time"

    "github.com/apcera/termtables"
    "github.com/araddon/dateparse"
)

var examples = []string{
    "May 8, 2009 5:57:51 PM",
    "Mon Jan  2 15:04:05 2006",
    "Mon Jan  2 15:04:05 MST 2006",
    "Mon Jan 02 15:04:05 -0700 2006",
    "Monday, 02-Jan-06 15:04:05 MST",
    "Mon, 02 Jan 2006 15:04:05 MST",
    "Tue, 11 Jul 2017 16:28:13 +0200 (CEST)",
    "Mon, 02 Jan 2006 15:04:05 -0700",
    "Thu, 4 Jan 2018 17:53:36 +0000",
    "Mon Aug 10 15:44:11 UTC+0100 2015",
    "Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)",
    "12 Feb 2006, 19:17",
    "12 Feb 2006 19:17",
    "03 February 2013",
    "2013-Feb-03",
    //   mm/dd/yy
    "3/31/2014",
    "03/31/2014",
    "08/21/71",
    "8/1/71",
    "4/8/2014 22:05",
    "04/08/2014 22:05",
    "4/8/14 22:05",
    "04/2/2014 03:00:51",
    "8/8/1965 12:00:00 AM",
    "8/8/1965 01:00:01 PM",
    "8/8/1965 01:00 PM",
    "8/8/1965 1:00 PM",
    "8/8/1965 12:00 AM",
    "4/02/2014 03:00:51",
    "03/19/2012 10:11:59",
    "03/19/2012 10:11:59.3186369",
    // yyyy/mm/dd
    "2014/3/31",
    "2014/03/31",
    "2014/4/8 22:05",
    "2014/04/08 22:05",
    "2014/04/2 03:00:51",
    "2014/4/02 03:00:51",
    "2012/03/19 10:11:59",
    "2012/03/19 10:11:59.3186369",
    // Chinese
    "2014年04月08日",
    //   yyyy-mm-ddThh
    "2006-01-02T15:04:05+0000",
    "2009-08-12T22:15:09-07:00",
    "2009-08-12T22:15:09",
    "2009-08-12T22:15:09Z",
    //   yyyy-mm-dd hh:mm:ss
    "2014-04-26 17:24:37.3186369",
    "2012-08-03 18:31:59.257000000",
    "2014-04-26 17:24:37.123",
    "2013-04-01 22:43",
    "2013-04-01 22:43:22",
    "2014-12-16 06:20:00 UTC",
    "2014-12-16 06:20:00 GMT",
    "2014-04-26 05:24:37 PM",
    "2014-04-26 13:13:43 +0800",
    "2014-04-26 13:13:44 +09:00",
    "2012-08-03 18:31:59.257000000 +0000 UTC",
    "2015-09-30 18:48:56.35272715 +0000 UTC",
    "2015-02-18 00:12:00 +0000 GMT",
    "2015-02-18 00:12:00 +0000 UTC",
    "2017-07-19 03:21:51+00:00",
    "2014-04-26",
    "2014-04",
    "2014",
    "2014-05-11 08:20:13,787",
    // mm.dd.yy
    "3.31.2014",
    "03.31.2014",
    "08.21.71",
    //  yyyymmdd and similar
    "20140601",
    // unix seconds, ms
    "1332151919",
    "1384216367189",
}

var (
    timezone = ""
)

func main() {
    flag.StringVar(&timezone, "timezone", "UTC", "Timezone aka `America/Los_Angeles` formatted time-zone")
    flag.Parse()

    if timezone != "" {
        // NOTE:  This is very, very important to understand
        // time-parsing in go
        loc, err := time.LoadLocation(timezone)
        if err != nil {
            panic(err.Error())
        }
        time.Local = loc
    }

    table := termtables.CreateTable()

    table.AddHeaders("Input", "Parsed, and Output as %v")
    for _, dateExample := range examples {
        t, err := dateparse.ParseLocal(dateExample)
        if err != nil {
            panic(err.Error())
        }
        table.AddRow(dateExample, fmt.Sprintf("%v", t))
    }
    fmt.Println(table.Render())
}

2
दुर्भाग्य से, दिन के महीने के आदेश में अस्पष्टता है। यूरोपीय तारीख प्रारूप दिन पहले और महीने दूसरे, और अमेरिकी समय प्रारूप रिवर्स का उपयोग करता है। 3/5/2004 की तारीख अस्पष्ट है। तारीख अमेरिका और यूरोपीय प्रारूप में मान्य है, लेकिन 3 और 5 दिन और महीने या रिवर्स के अनुरूप हो सकते हैं। dateParse मान लें कि US प्रारूप है।
चीकू

-1

यदि आपने अन्य भाषाओं में समय / तारीख स्वरूपण / पार्सिंग के साथ काम किया है तो आपने देखा होगा कि अन्य भाषाएं समय / तिथि प्रारूपण के लिए विशेष प्लेसहोल्डर्स का उपयोग करती हैं। उदाहरण के लिए रूबी भाषा का उपयोग करता है

%d for day
%Y for year

आदि गोलांग, उपरोक्त जैसे कोड का उपयोग करने के बजाय, दिनांक और समय प्रारूप प्लेसहोल्डर का उपयोग करता है जो केवल दिनांक और समय की तरह दिखते हैं। जाओ मानक समय का उपयोग करता है, जो है:

Mon Jan 2 15:04:05 MST 2006  (MST is GMT-0700)
or 
01/02 03:04:05PM '06 -0700

तो अगर आप नोटिस करते हैं तो गो उपयोग करता है

01 for the day of the month,
02 for the month
03 for hours,
04 for minutes
05 for second
and so on

इसलिए उदाहरण के लिए 2020-01-29 को पार्स करने के लिए, लेआउट स्ट्रिंग 06-01-02 या 2006-01-02 होना चाहिए।

आप इस लिंक पर पूर्ण प्लेसहोल्डर लेआउट तालिका का उल्लेख कर सकते हैं - https://golangbyexample.com/parse-time-in-bolol/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.