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()।