তারিখ / সময়ের তুলনা কীভাবে করবেন


102

গোতে তারিখ তুলনা করার কোনও বিকল্প আছে কি? আমাকে তারিখ এবং সময় অনুসারে ডেটা বাছাই করতে হবে - স্বতন্ত্রভাবে। সুতরাং আমি তারিখের একটি পরিসীমা মধ্যে ঘটতে পারে যে একটি অবজেক্ট এত দীর্ঘ সময় এর মধ্যে ঘটে হিসাবে অনুমতি দিতে পারে। এই মডেলটিতে আমি কেবল প্রাচীনতম তারিখ, সর্বকনিষ্ঠ সময় / সর্বশেষ তারিখ, সর্বশেষ সময় এবং ইউনিক্স () সেকেন্ডের তুলনা করতে পারিনি। আমি সত্যিই কোন পরামর্শ প্রশংসা করব।

শেষ পর্যন্ত, আমি একটি সময় পার্সিংয়ের স্ট্রিং তুলনা মডিউল লিখেছিলাম যে কোনও সময় কোনও সীমার মধ্যে রয়েছে কিনা তা পরীক্ষা করতে। তবে এটি ভাল লাগার মতো নয়; আমি কিছু ফাঁক সমস্যা পেয়েছি। আমি এখানে কেবল মজাদার জন্য পোস্ট করব, তবে আমি আশা করি সময়ের তুলনার আরও ভাল উপায় আছে।

package main

import (
    "strconv"
    "strings"
)

func tryIndex(arr []string, index int, def string) string {
    if index <= len(arr)-1 {
        return arr[index]
    }
    return def
}

/*
 * Takes two strings of format "hh:mm:ss" and compares them.
 * Takes a function to compare individual sections (split by ":").
 * Note: strings can actually be formatted like "h", "hh", "hh:m",
 * "hh:mm", etc. Any missing parts will be added lazily.
 */
func timeCompare(a, b string, compare func(int, int) (bool, bool)) bool {
    aArr := strings.Split(a, ":")
    bArr := strings.Split(b, ":")
    // Catches margins.
    if (b == a) {
        return true
    }
    for i := range aArr {
        aI, _ := strconv.Atoi(tryIndex(aArr, i, "00"))
        bI, _ := strconv.Atoi(tryIndex(bArr, i, "00"))
        res, flag := compare(aI, bI)
        if res {
            return true
        } else if flag { // Needed to catch case where a > b and a is the lower limit
            return false
        }
    }
    return false
}

func timeGreaterEqual(a, b int) (bool, bool) {return a > b, a < b}
func timeLesserEqual(a, b int) (bool, bool) {return a < b, a > b}

/*
 * Returns true for two strings formmated "hh:mm:ss".
 * Note: strings can actually be formatted like "h", "hh", "hh:m",
 * "hh:mm", etc. Any missing parts will be added lazily.
 */
func withinTime(timeRange, time string) bool {
    rArr := strings.Split(timeRange, "-")
    if timeCompare(rArr[0], rArr[1], timeLesserEqual) {
        afterStart := timeCompare(rArr[0], time, timeLesserEqual)
        beforeEnd := timeCompare(rArr[1], time, timeGreaterEqual)
        return afterStart && beforeEnd
    }
    // Catch things like `timeRange := "22:00:00-04:59:59"` which will happen
    // with UTC conversions from local time.
    // THIS IS THE BROKEN PART I BELIEVE
    afterStart := timeCompare(rArr[0], time, timeLesserEqual)
    beforeEnd := timeCompare(rArr[1], time, timeGreaterEqual)
    return afterStart || beforeEnd
}

তাই টিএলডিআর, আমি একটি টাইমরেঞ্জ (সীমা, সময়) ফাংশন লিখেছি তবে এটি পুরোপুরি সঠিকভাবে কাজ করছে না। (প্রকৃতপক্ষে, বেশিরভাগ ক্ষেত্রে কেবল দ্বিতীয় ক্ষেত্রে, যেখানে কয়েক দিনের মধ্যে একটি সময়সীমা অতিক্রম করা হয় The মূল অংশটি কাজ করেছিল, আমি ঠিক বুঝতে পেরেছিলাম স্থানীয় থেকে ইউটিসি-তে রূপান্তর করার সময় আমাকে তার জন্য অ্যাকাউন্টিং করতে হবে))

যদি আরও ভাল (পছন্দসই অন্তর্নির্মিত) উপায়ে থাকে তবে আমি এটি সম্পর্কে শুনতে আগ্রহী!

দ্রষ্টব্য: যেমন একটি উদাহরণ হিসাবে, আমি জাভাস্ক্রিপ্টে এই সমস্যাটি দিয়ে এই সমস্যাটি সমাধান করেছি:

function withinTime(start, end, time) {
    var s = Date.parse("01/01/2011 "+start);
    var e = Date.parse("01/0"+(end=="24:00:00"?"2":"1")+"/2011 "+(end=="24:00:00"?"00:00:00":end));
    var t = Date.parse("01/01/2011 "+time);
    return s <= t && e >= t;
}

তবে আমি সত্যিই এই ফিল্টারটি সার্ভার-সাইড করতে চাই।

উত্তর:


116

Go তে সময় তথ্যের সাথে কাজ করতে সময় প্যাকেজটি ব্যবহার করুন ।

সময়, তাত্ক্ষণিকের আগে, পরে এবং সমান পদ্ধতিগুলি ব্যবহার করে তুলনা করা যেতে পারে। সাব পদ্ধতিটি দুটি তাত্ক্ষণিক বিয়োগ করে একটি সময়কাল উত্পাদন করে। অ্যাড পদ্ধতিটি একটি সময় এবং সময়কাল যুক্ত করে একটি সময় তৈরি করে।

খেলুন উদাহরণ:

package main

import (
    "fmt"
    "time"
)

func inTimeSpan(start, end, check time.Time) bool {
    return check.After(start) && check.Before(end)
}

func main() {
    start, _ := time.Parse(time.RFC822, "01 Jan 15 10:00 UTC")
    end, _ := time.Parse(time.RFC822, "01 Jan 16 10:00 UTC")

    in, _ := time.Parse(time.RFC822, "01 Jan 15 20:00 UTC")
    out, _ := time.Parse(time.RFC822, "01 Jan 17 10:00 UTC")

    if inTimeSpan(start, end, in) {
        fmt.Println(in, "is between", start, "and", end, ".")
    }

    if !inTimeSpan(start, end, out) {
        fmt.Println(out, "is not between", start, "and", end, ".")
    }
}

4
সম্ভবত আমি পড়তে পারি না, তবে সময়ের তুলনা সম্পর্কে আমি সেখানে কিছুই দেখতে পেলাম না। যদি এটি সেখানে থাকে তবে আপনি কি আমাকে একটি নিবন্ধের দিকে নির্দেশ করতে পারেন?
ইটোনফিল

12
Godoc.org/time#Time.Equal বা Godoc.org/time#Time.After চেষ্টা করুন সহজ তুলনা করার জন্য, বা Godoc.org/Time#Time.Sub দুই বারের মধ্যে পার্থক্য খুঁজে বের করতে।
andybalholm

4
"সময় তাত্ক্ষণিক টি আপনার পরে রয়েছে কিনা তা রিপোর্ট করে" " অদ্ভুত
ড্যামিয়েন রোচে

24

দুটি সময়ের মধ্যে তুলনার জন্য সময় ব্যবহার করুন ubশব্দ ()

// utc life
loc, _ := time.LoadLocation("UTC")

// setup a start and end time
createdAt := time.Now().In(loc).Add(1 * time.Hour)
expiresAt := time.Now().In(loc).Add(4 * time.Hour)

// get the diff
diff := expiresAt.Sub(createdAt)
fmt.Printf("Lifespan is %+v", diff)

প্রোগ্রাম আউটপুট:

Lifespan is 3h0m0s

http://play.golang.org/p/bbxeTtd4L6


4
এটি সেরা উত্তর।
মিথুনস

এটি একটি ভাল উত্তর।
মাজেন্ড

15

ক্ষেত্রে যখন আপনার ব্যবধানটি শেষ হয় তখন "2017-01-01 থেকে 2017-01-16 এর পুরো দিন পর্যন্ত" ঘন্টা ব্যতীত তারিখটি "বিরতি" 23 ঘন্টা 59 মিনিট এবং 59 সেকেন্ডের মতো ঠিক করা ভাল:

end = end.Add(time.Duration(23*time.Hour) + time.Duration(59*time.Minute) + time.Duration(59*time.Second)) 

if now.After(start) && now.Before(end) {
    ...
}

4
বর্তমান সময়ের সাথে একটি সঞ্চিত টাইমস্ট্যাম্পের তুলনা করার জন্য আমার ঠিক কী দরকার ছিল।
পিজিপি_প্রোটেক্টর

1

সাম্প্রতিক প্রোটোকলগুলি গোলং সময় প্যাকেজ ডকুমেন্টেশনের জন্য আরএফসি 3339 ব্যবহার পছন্দ করে ।

সাধারণভাবে আরএফসি 1123 জেডটি সেই ফর্ম্যাটটিতে জোর দেওয়া সার্ভারগুলির জন্য আরএফসি 1123 এর পরিবর্তে ব্যবহার করা উচিত এবং নতুন প্রোটোকলের জন্য আরএফসি 3339 পছন্দ করা উচিত। আরএফসি 822, আরএফসি 822 জেড, আরএফসি 1123, এবং আরএফসি1123 জেড ফর্ম্যাট করার জন্য দরকারী; যখন সময়ের সাথে ব্যবহৃত হয়। পার্স করুন তারা আরএফসি দ্বারা অনুমোদিত সমস্ত সময় বিন্যাসগুলি গ্রহণ করে না।

cutOffTime, _ := time.Parse(time.RFC3339, "2017-08-30T13:35:00Z")
// POSTDATE is a date time field in DB (datastore)
query := datastore.NewQuery("db").Filter("POSTDATE >=", cutOffTime).

-2

নিম্নলিখিতটি স্ট্রিংটিকে তারিখে রূপান্তরিত করার আমার সমস্যার সমাধান করেছে

প্যাকেজ প্রধান

import (
    "fmt"
    "time"
)

func main() {
    value  := "Thu, 05/19/11, 10:47PM"
    // Writing down the way the standard time would look like formatted our way
    layout := "Mon, 01/02/06, 03:04PM"
    t, _ := time.Parse(layout, value)
    fmt.Println(t)
}

// => "Thu May 19 22:47:00 +0000 2011"

পল আদম স্মিথকে ধন্যবাদ


4
এগুলি সব সুন্দর তবে প্রশ্নটির সাথে অনেক কিছুই করার নেই, এটি কি?
ম্যাথিয়াস ক্রল

আপনি ঠিক @ মথিথিস্ক্রল এটি খেজুরের তুলনা করার প্রশ্নের উত্তর দেয় না, তবে আংশিকভাবে খেজুরকে সহজেই পার্সিংয়ে সহায়তা করে।
সূর্যকৃপা

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