C#-এ DateTime.SpecifyKind() মেথডটি একটি নতুন DateTime অবজেক্ট তৈরি করে যার টিক্স (Ticks) মান আগেরটির মতোই থাকে, কিন্তু Kind প্রোপার্টি (Local, Utc, Unspecified) পরিবর্তন করা হয়। এটি টাইমজোন কনভারশন নहीं করে।
সিনট্যাক্স (Syntax)
public static DateTime SpecifyKind(DateTime value, DateTimeKind kind);
প্যারামিটার:
value- সোর্স DateTimekind- নতুন Kind (DateTimeKind.Local,DateTimeKind.Utc,DateTimeKind.Unspecified)
DateTimeKind এনামারেশন
| মান | বর্ণনা |
|---|---|
Unspecified | কোনো টাইমজোন তথ্য নেই (ডিফল্ট) |
Utc | Coordinated Universal Time |
Local | সিস্টেমের লোকাল টাইমজোন |
উদাহরণ ১: Unspecified থেকে Local-এ পরিবর্তন
using System;
using System.Globalization;
public class Demo
{
public static void Main()
{
DateTime d = new DateTime(2019, 10, 11, 11, 10, 42); // Kind = Unspecified
DateTime res = DateTime.SpecifyKind(d, DateTimeKind.Local);
Console.WriteLine("Original Kind: " + d.Kind); // Unspecified
Console.WriteLine("New Kind: " + res.Kind); // Local
Console.WriteLine("Ticks same: " + (d.Ticks == res.Ticks)); // True
}
}
আউটপুট
Kind = Local
উদাহরণ ২: Unspecified থেকে Utc-এ পরিবর্তন
using System;
public class Demo
{
public static void Main()
{
DateTime d = new DateTime(2019, 11, 25, 10, 20, 35); // Kind = Unspecified
DateTime res = DateTime.SpecifyKind(d, DateTimeKind.Utc);
Console.WriteLine("Original Kind: " + d.Kind); // Unspecified
Console.WriteLine("New Kind: " + res.Kind); // Utc
Console.WriteLine("Ticks same: " + (d.Ticks == res.Ticks)); // True
}
}
আউটপুট
Kind = Utc
SpecifyKind() vs ToUniversalTime() / ToLocalTime()
| মেথড | টিক্স পরিবর্তন হয়? | Kind পরিবর্তন হয়? | উদ্দেশ্য |
|---|---|---|---|
| SpecifyKind() | না | হ্যাঁ | শুধু মেটাডেটা (Kind) পরিবর্তন |
| ToUniversalTime() | হ্যাঁ | হ্যাঁ (→ Utc) | লোকাল টাইম → UTC কনভার্সন |
| ToLocalTime() | হ্যাঁ | হ্যাঁ (→ Local) | UTC → লোকাল টাইম কনভার্সন |
দৃষ্টান্ত: পার্থক্য দেখা
using System;
public class Demo
{
public static void Main()
{
// অনুমান করুন সিস্টেম টাইমজোন UTC+6 (বাংলাদেশ)
DateTime unspecified = new DateTime(2023, 1, 1, 12, 0, 0); // Kind=Unspecified
Console.WriteLine($"Original: {unspecified} (Kind: {unspecified.Kind})");
Console.WriteLine($"Ticks: {unspecified.Ticks}");
Console.WriteLine();
// SpecifyKind - টিক্স অপরিবর্তিত
DateTime asLocal = DateTime.SpecifyKind(unspecified, DateTimeKind.Local);
Console.WriteLine($"As Local: {asLocal} (Kind: {asLocal.Kind})");
Console.WriteLine($"Ticks: {asLocal.Ticks} (Same: {asLocal.Ticks == unspecified.Ticks})");
Console.WriteLine();
// ToUniversalTime - টিক্স পরিবর্তন (UTC-এ কনভার্ট)
DateTime asUtc = unspecified.ToUniversalTime(); // Unspecified কে Local মনে করে
Console.WriteLine($"ToUniversalTime: {asUtc} (Kind: {asUtc.Kind})");
Console.WriteLine($"Ticks: {asUtc.Ticks} (Same: {asUtc.Ticks == unspecified.Ticks})");
}
}
প্রয়োগিক ব্যবহারের ক্ষেত্র
১. ডেটাবেস থেকে পড়া UTC ডেটাকে সঠিক Kind দেয়া
// ডেটাবেসে UTC সংরক্ষিত, কিন্তু Kind=Unspecified আসে DateTime dbTime = reader.GetDateTime(0); // 2023-01-01 12:00:00, Kind=Unspecified // সঠিকভাবে UTC হিসেবে মার্ক করা DateTime utcTime = DateTime.SpecifyKind(dbTime, DateTimeKind.Utc); // এখন নিরাপদে লোকাল-এ কনভার্ট করা যায় DateTime localTime = utcTime.ToLocalTime();
২. JSON ডিসিরিয়ালাইজেশনের পর Kind ফিক্স করা
// JSON-এ "2023-01-01T12:00:00Z" (Z = UTC) // কিছু ডিসিরিয়ালাইজার Kind=Unspecified দিয়ে দেয় DateTime parsed = JsonSerializer.Deserialize(json); // ফিক্স if (parsed.Kind == DateTimeKind.Unspecified) { parsed = DateTime.SpecifyKind(parsed, DateTimeKind.Utc); }
সতর্কতা: SpecifyKind ব্যবহার করে ভুল Kind সেট করলে (যেমন UTC ডেটাকে Local বলা) পরবর্তী কনভারশনে বড় ত্রুটি হয়।