কম্পিউটার টিউটোরিয়াল

C#-এ DateTime.ToBinary() মেথড: DateTimeকে ৬৪-বিট বাইনারি-এ সিরিয়ালাইজ


C#-এ DateTime.ToBinary() মেথডটি বর্তমান DateTime অবজেক্টকে একটি ৬৪-বিট বাইনারি মান (long) এ সিরিয়ালাইজ করে। এই বাইনারি মানを無断で DateTime.FromBinary() ব্যবহার করে মূল DateTime অবজেক্ট পুনরুদ্ধার করা যায়।

সিনট্যাক্স (Syntax)

public long ToBinary();

উদাহরণ ১: নির্দিষ্ট তারিখ সিরিয়ালাইজেশন

using System;

public class Demo
{
    public static void Main()
    {
        DateTime d = new DateTime(2019, 10, 10, 8, 10, 40);
        Console.WriteLine("Date = {0}", d);
        
        long res = d.ToBinary();
        Console.WriteLine("64-bit binary value : {0}", res);
    }
}

আউটপুট

Date = 10/10/2019 8:10:40 AM
64-bit binary value : 637062918400000000

উদাহরণ ২: বর্তমান সময় (DateTime.Now) সিরিয়ালাইজেশন

using System;

public class Demo
{
    public static void Main()
    {
        DateTime d = DateTime.Now;
        Console.WriteLine("Date = {0}", d);
        
        long res = d.ToBinary();
        Console.WriteLine("64-bit binary value : {0}", res);
    }
}

আউটপুট (উদাহরণ)

Date = 10/16/2019 8:15:56 AM
64-bit binary value : -8586303931293472296

নোট: নেগেটিভ মান হলে Kind=Local এবং টিক্স মান বড় হলে চিহ্ন বিট সেট হয়।

বাইনারি ফরম্যাটের গঠন (64-bit)

  • বিট ০-৬১ (৬২ বিট): Ticks (১৬০১ সাল থেকে ১০০-ন্যানোসেকেন্ড)
  • বিট ৬২-৬৩ (২ বিট): Kind (0=Unspecified, 1=Utc, 2=Local)

বিট লেআউট

| Kind (2 bits) |        Ticks (62 bits)        |
|      63-62    |             61-0              |

Round-trip: সিরিয়ালাইজেশন → ডিসিরিয়ালাইজেশন

using System;

public class BinaryRoundTrip
{
    public static void Main()
    {
        DateTime original = new DateTime(2023, 12, 25, 10, 30, 0, DateTimeKind.Utc);
        Console.WriteLine("Original: " + original);
        Console.WriteLine("Kind: " + original.Kind);
        
        // Serialize
        long binary = original.ToBinary();
        Console.WriteLine("Binary: " + binary);
        Console.WriteLine("Hex: 0x" + binary.ToString("X"));
        
        // Deserialize
        DateTime restored = DateTime.FromBinary(binary);
        Console.WriteLine("Restored: " + restored);
        Console.WriteLine("Kind: " + restored.Kind);
        Console.WriteLine("Match: " + (original == restored));
    }
}

আউটপুট

Original: 12/25/2023 10:30:00 AM
Kind: Utc
Binary: 638395290000000000
Hex: 0x8CFE9A3B1A000000
Restored: 12/25/2023 10:30:00 AM
Kind: Utc
Match: True

Kind=Local এর সমস্যা এবং সমাধান

সমস্যা: Kind=Local वाले DateTime অন্য টাইমজোনের মেশিনে ডিসিরিয়ালাইজ করলে ভিন্ন লোকাল টাইম দেখাবে।

সমাধান: UTC-এ সিরিয়ালাইজ করুন

// সিরিয়ালাইজেশনের আগে UTC-এ কনভার্ট
DateTime utc = localDateTime.ToUniversalTime();
long binary = utc.ToBinary(); // Kind=Utc ধরে সংরক্ষিত হবে

// ডিসিরিয়ালাইজেশনের পর লোকাল-এ কনভার্ট
DateTime restoredUtc = DateTime.FromBinary(binary);
DateTime local = restoredUtc.ToLocalTime();

ব্যালিডেশন: Min/Max মান

Console.WriteLine("MinValue binary: " + DateTime.MinValue.ToBinary());  // 0
Console.WriteLine("MaxValue binary: " + DateTime.MaxValue.ToBinary());  // 3155378975999999999

সংশ্লিষ্ট মেথড: DateTime.FromBinary(), DateTime.ToFileTime(), DateTime.ToOADate()।

  1. C#-এ DateTime.AddYears() পদ্ধতি

  2. C#-এ DateTime.AddHours() মেথড

  3. C#-এ DateTime.AddDays() মেথড

  4. C#-এ DateTime.Add() মেথড