সময় ব্যবস্থাপনা খুব জটিল। সময় সম্পর্কিত সাধারণ ভুল ধারণা এমন হলো নিম্নলিখিত।

  1. দিন সম্পূর্ণ হলো ২৪ ঘণ্টা।
  2. এক ঘণ্টা ৬০ মিনিট ধরে।
  3. এক সপ্তাহে সাত দিন থাকে।
  4. এক বছরে ৩৬৫ দিন থাকে।

উদাহরণস্বরূপ, 1 এর অর্থ হলো নির্দিষ্ট সময়ে ২৪ ঘণ্টা যোগ করলে সাধারণ বর্ষপত্রে নতুন একটি দিন উদ্ভব হয় না।

তাই, সময় নিয়ে কাজ করার সময় সর্বদা উর্ধ্বতম এবং সঠিক পথে এগিয়ে যান "time" প্যাকেজ ব্যবহার করুন, যা এই ভুল ধারণাগুলি সঁজুলে এবং আরও নিরাপদ এবং নির্ভুত ভাবে ব্যবস্থা করার সাহায্য করে।

ছবিতে time.Time ব্যবহার করে ছবিপ্রস্থান সময় প্রতিনিধিতা করা

ছবিপ্রস্থান সময়ে কাজে সময় পোষাকে ব্যবহার করুন time.Time এবং এর পদ্ধতিগুলি ব্যবহার করুন সময় তুলনা, যোগ করা, বা বিয়োগ করা।

সুপারিশ না করা:

func isActive(now, start, stop int) bool {
  return start <= now && now < stop
}

সুপারিশ করা:

func isActive(now, start, stop time.Time) bool {
  return (start.Before(now) || start.Equal(now)) && now.Before(stop)
}

time.Duration ব্যবহার করে সময় স্থায়ীতা প্রতিরূপ করা

সময় স্থায়ীতা প্রতিরূপে কাজ করার সময় সময় পোষাকে ব্যবহার করুন time.Duration

সুপারিশ না করা:

func poll(delay int) {
  for {
    // ...
    time.Sleep(time.Duration(delay) * time.Millisecond)
  }
}
poll(10) // এটি সেকেন্ড কিনা বা মিলিসেকেন্ড?

সুপারিশ করা:

func poll(delay time.Duration) {
  for {
    // ...
    time.Sleep(delay)
  }
}
poll(10*time.Second)

প্রথম উদাহরণে ফিরে যাই, ছবিপ্রস্থান সময়ে ২৪ ঘণ্টা যোগ করা হলে, ব্যবহৃত পদ্ধতি উদ্ভাবের উদ্দেশ্যত্রয় নির্ভর করে। আমরা যদি একই সময় নকল বর্ষপত্রের পরে আগামী দিনে নির্ধারিত সময় বিন্যাস করতে চাই, তবে আমরা ব্যবহার করতে হবে Time.AddDate। তবে, আমরা যদি একই সাময়িক নির্ধারণ করতে চাই যে ২৪ ঘণ্টা আগের তারেখা থেকে পরবর্তী একটি নির্ধারিত মুহূর্ত নিশ্চিত করতে চাই, তবে আমাদের ব্যবহার করতে হবে Time.Add

newDay := t.AddDate(0 /* বছর */, 0 /* মাস */, 1 /* দিন */)
maybeNewDay := t.Add(24 * time.Hour)

বাহ্যিক সিস্টেম সঙ্গে time.Time এবং time.Duration ব্যবহার

যখনই সম্ভব, বিদেশী সিস্টেম সঙ্গে অনুপ্রেরণা ক্রিয়া করার জন্য time.Duration এবং time.Time ব্যবহার করুন, উদাহরণস্বরূপ:

  • কমান্ড-লাইন ফ্ল্যাগগুলি: flag ব্যবহার করে time.ParseDuration দিয়ে time.Duration সমর্থন করে।
  • JSON: encoding/jsontime.Time কে RFC 3339 স্ট্রিংয়ে এনকোড করার জন্য এর UnmarshalJSON মেথড সমর্থন করে।
  • SQL: database/sql ব্যবহার করে DATETIME বা TIMESTAMP কলামগুলি কে time.Time এ রূপান্তর করে এবং তা প্রত্যাধিকারী ড্রাইভার যদি সমর্থন করে তাহলে এটি প্রদান করে।
  • YAML: gopkg.in/yaml.v2time.Time এবং time.Duration সমর্থন করে যাতে এগুলি RFC 3339 স্ট্রিং হয়। time.ParseDuration দিয়ে।

যখন এই ইন্টারেকশনে time.Duration ব্যবহার করা যায় না, তখন ফিল্ড নামে ইউনিটটি সহ int বা float64 ব্যবহার করুন।

উদাহরণস্বরূপ, যেমন, encoding/json যখন time.Duration সমর্থন করে না, তখন ফিল্ড নামে ইউনিটটি সহ ব্যবহার করা হয়।

অনুমোদিত নয়:

// {"interval": 2}
type Config struct {
  Interval int `json:"interval"`
}

অনুমোদিত:

// {"intervalMillis": 2000}
type Config struct {
  IntervalMillis int `json:"intervalMillis"`
}

যেসব ইন্টারেকশনে time.Time ব্যবহার করা যায় না, মাঝেমধ্যে অনুমতি দেওয়া না হলে, স্ট্রিং ব্যবহার করুন এবং RFC 3339 অনুসারে টাইমস্ট্যাম্প ফরম্যাট করুন। ডিফল্টভাবে, Time.UnmarshalText এই ফরম্যাট ব্যবহার করে এবং এটি Time.Format এবং time.Parsetime.RFC3339 দিয়ে ব্যবহার করা যায়।

সংস্কার শঙ্কাস্বরূপ, দয়া করে মনে রাখবেন যে, "time" প্যাকেজটি লীপ সেকেন্ড টাইমস্ট্যাম্প পার্সিং সমর্থন করে না (8728), এবং গণনায় লীপ সেকেন্ড অবগত করে না (15190)। যদি আপনি দুটি সময়ের মুহূর্ত তুলনা করেন, তার মধ্যে যে কোনও লীপ সেকেন্ড যুক্ত নহয় যা উভয় সময়ের মধ্যে ঘটে হতে পারে।