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কিছু পাগল গো স্ট্যান্ডার্ডের কারণে হওয়া উচিত
থারিন্ডুউজিবর্ধনে

উত্তর:


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
যাঁরা লেআউট নম্বরগুলি পান না, তাদের পক্ষে আমি প্রথম নজরে এটি খুব বিদেশী স্বীকার করি তবে আপনি যদি এটির অভ্যস্ত হয়ে যান তবে আমি মনে করি এটি সাধারণ লেআউট ডিভাইসের চেয়ে কমপক্ষে ততটা অর্থবোধ করে ('আমি কি "ডি" ব্যবহার করি, "ডি", "ডিডি", "ডিডি", ইত্যাদি?) এবং সম্ভবত আরও বোধগম্য। আপনাকে প্রথমে এটি সম্পর্কে জানতে হবে।
তিনটি

5
এটি স্মৃতিভিত্তিক উদ্দেশ্যে, অর্থাৎ আপনাকে কেবল এই চিঠিগুলি 1, 2, 3, 4, 5, 6, 7 মনে রাখতে হবে। আছে: একটি মহান নিবন্ধ এই আলোচনা এর medium.com/@simplyianm/...
amigcamel

85

ব্যবহারের বিন্যাস প্রকৃতপক্ষে হয় " 2006-01-02T15:04:05.000Z" বর্ণিত RickyA এর উত্তর
এটি "যাওয়ার প্রথম প্রতিশ্রুতির সময়" নয়, বরং বলা লেআউটটি মনে রাখার এক স্মরণীয় উপায়।
দেখুন pkg / সময় :

বিন্যাসগুলিতে ব্যবহৃত রেফারেন্স সময়টি হ'ল:

Mon Jan 2 15:04:05 MST 2006

যা ইউনিক্স সময় 1136239445
যেহেতু এমএসটি GMT-0700, রেফারেন্স সময়টি হিসাবে ভাবা যেতে পারে

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

(1,2,3,4,5,6,7, আপনি যদি মনে রাখেন যে 1 টি মাসের জন্য, এবং 2 দিনের জন্য, যা আমার মতো ইউরোপীয়ানের পক্ষে খুব সহজ নয়, তবে ডে-মাসের তারিখের ফর্ম্যাটটি ব্যবহৃত হয়)

" টাইম.পারস " এ চিত্রিত হিসাবে, গোলং কেন সময়কে ভুলভাবে পার্স করে? ", সেই বিন্যাসটি (1,2,3,4,5,6,7 ব্যবহার করে) অবশ্যই ঠিক সম্মান করা উচিত ।


হ্যাঁ, অস্ট্রেলিয়ানদেরও আউট! এমএম / ডিডি কেবল আমার জন্য গণনা করে না এবং আমাকে এটির দিকে তাকিয়ে থাকতে হবে।
সাইমন হোয়াইটহেড

3
@ সিমন হোয়াইটহেড কমপক্ষে, একবার আমি এটি সন্ধান করলে, আমি জানি ওয়াইওয়াই, এমএম, ডিডি, এইচএইচ, মিমি, এস কী দাঁড়ায় এবং আমি সেগুলি সহজেই পুনরায় অর্ডার করতে পারি। গো সহ, এটি সন্ধানের পরেও, আমার 1, 2, 3, 4 ... কী দাঁড়াচ্ছে তা মনে রাখা দরকার।
ভনসি

1
পথ আমি এটা মনে রাখবেন হল: ধাপ 1) "সঠিক" তারিখ ক্রম হয় বছর> মাস> দিন> ঘন্টা> মিনিট> দ্বিতীয়> ইত্যাদি (কারণ মিশ্র-endian শুধু অ sensically অবাধ এবং অসঙ্গত এবং হবে তারিখগুলি জন্য big- এন্ডিয়ান ছোট-এন্ডিয়ানদের চেয়ে বেশি পছন্দনীয় কারণ এটি বাছাই-বান্ধব।) এটি আমাদেরকে 1 (বছর), 2 (মাস), 3 (দিন), [...] পদক্ষেপ 2) গো / গুগল আমেরিকান এবং আমেরিকানরা তাদের বছর তাদের তারিখ শেষে, সুতরাং পরিবর্তে এটি 1 (মাস), 2 (দিন), [...], এন (বছর) পদক্ষেপ 3) সময় অঞ্চলটি সমস্ত কিছুর পরে যায় কারণ সময় অঞ্চলগুলি একটি অতিরিক্ত বিমূর্ত স্তর are
mtraceur

@mtraceur হ্যাঁ ... আমি মিস web.archive.org/web/20180501100155/http://... (থেকে github.com/bdotdub/fuckinggodateformat )। মানে, strftimeএফটিডাব্লু।
ভনসি

58

উত্তর হিসাবে কিন্তু "2006-01-02T15:04:05.000Z"লেআউটটির জন্য টাইপিং সংরক্ষণ করতে, আপনি প্যাকেজের ধ্রুবক আরএফসি 3339 ব্যবহার করতে পারেন ।

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এবং উল্লেখ করে যে Go এর time.RFC3339কাজ করবে। কিন্তু time.RFC3339 = "2006-01-02T15:04:05Z07:00"। এই দুই ফরম্যাটের ঠিক কি হিসাবে যতটুকু হয় সমতুল্য time.Parseএবং time.ParseInLocationকরবেন?
মাইলস

1
এটি ঠিক মাইলস, এই পরীক্ষাটি এটি খেলতে
পি / টি

24

আমি সময় ব্যবহার করার পরামর্শ দেব time টাইম প্যাকেজ থেকে ধ্রুবক। আপনি সময় প্যাকেজ থেকে অন্যান্য ধ্রুবক পরীক্ষা করতে পারেন। 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 টা)
  • 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 দিন এবং মাস বা বিপরীতে মিলতে পারে। তারিখ পার্স মার্কিন ফর্ম্যাট অনুমান।
chmike

-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-golang/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.