ডেটটাইম বনাম ডেটটাইম অফসেট


742

বর্তমানে, আমাদের কাছে DateTimeটাইমজোন সচেতন উপায়ে নেট নেট ব্যবহার করার একটি স্ট্যান্ডার্ড পদ্ধতি রয়েছে : যখনই আমরা একটি উত্পাদন DateTimeকরি আমরা এটি ইউটিসি-তে (যেমন ব্যবহার করে DateTime.UtcNow) করি এবং যখনই আমরা এটি প্রদর্শন করি তখন আমরা ইউটিসি থেকে স্থানীয় ব্যবহারকারীর সময়ে রূপান্তর করি convert ।

এটি সূক্ষ্মভাবে কাজ করে, তবে আমি DateTimeOffsetকীভাবে এটি স্থানীয় এবং ইউটিসি সময়টিকে অবজেক্টের মধ্যে নিয়ে যায় এবং সে সম্পর্কে পড়ছি । সুতরাং প্রশ্নটি হচ্ছে, DateTimeOffsetআমরা ইতিমধ্যে যা করছি তার তুলনায় ব্যবহারের সুবিধাগুলি কী হবে ?


3
নীচে কিছু দুর্দান্ত উত্তর আছে। তবে আমি এখনও অবাক হয়ে ভাবছি কি, যদি কিছু থাকে তবে আপনাকে ডেটটাইম অফসেট ব্যবহার শুরু করতে রাজি করানো যায়।
শুভনোমাদ

1
পাশাপাশি দেখতে হতে পারে যখন-হবু আপনি-পছন্দ-DATETIME ওভার datetimeoffset
nawfal

যখন এটি স্টোরেজ এ আসে, স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 1547১66২০/২ আকর্ষণীয়ও।
দেজান

উত্তর:


1169

DateTimeOffsetএকটি উপস্থাপনা ক্ষণিক সময় (নামেও পরিচিত পরম সময় )। তারপরে, আমি সময়ের একটি মুহুর্তটি বোঝাই যা সবার কাছে সর্বজনীন ( লিপ সেকেন্ডের জন্য অ্যাকাউন্টিং নয় , বা সময় বিচ্ছুরণের আপেক্ষিক প্রভাব )। তাত্ক্ষণিক সময় উপস্থাপনের অন্য উপায়টি DateTimeযেখানে .Kindরয়েছে DateTimeKind.Utc

এটি ক্যালেন্ডারের সময় থেকে আলাদা ( সিভিল টাইম নামেও পরিচিত ), যা কারও ক্যালেন্ডারে একটি অবস্থান এবং সারা পৃথিবীতে অনেকগুলি বিভিন্ন ক্যালেন্ডার রয়েছে। আমরা এই ক্যালেন্ডারগুলিকে সময় অঞ্চল বলি । ক্যালেন্ডার সময় একটি DateTimeযেখানে বা .Kindহয় দ্বারা প্রতিনিধিত্ব করা হয় । এবং ফলাফলগুলি ব্যবহার করা কম্পিউটারটি কোথায় অবস্থান করছে সে সম্পর্কে আপনার অন্তর্নিহিত ধারণা রয়েছে এমন পরিস্থিতিতে কেবল অর্থবহ ful (উদাহরণস্বরূপ, ব্যবহারকারীর ওয়ার্কস্টেশন)DateTimeKind.UnspecifiedDateTimeKind.Local.Local

তাহলে, DateTimeOffsetইউটিসির পরিবর্তে কেন DateTime? এটা সব দৃষ্টিকোণ সম্পর্কে। আসুন একটি উপমা ব্যবহার করুন - আমরা ফটোগ্রাফার হওয়ার ভান করব।

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

ফটোতে দাঁড়িয়ে থাকা ব্যক্তিটি আপনার ক্যামেরাটি যে কোণ থেকে এসেছে তা দেখতে পাবে। অন্যরা যদি ছবি তুলছিল, তারা বিভিন্ন কোণ থেকে হতে পারে। এটিই Offsetঅংশটির DateTimeOffsetপ্রতিনিধিত্ব করে।

সুতরাং আপনি যদি আপনার ক্যামেরাকে "পূর্ব সময়" লেবেল করেন, কখনও কখনও আপনি -5 থেকে পয়েন্ট করছেন এবং কখনও কখনও আপনি -4 থেকে পয়েন্ট করছেন। সারা বিশ্ব জুড়ে ক্যামেরা রয়েছে, সমস্ত আলাদা আলাদা লেবেলযুক্ত জিনিস এবং সমস্ত একই কোণ থেকে একই তাত্ক্ষণিক টাইমলাইনে নির্দেশ করে। তাদের মধ্যে কিছু একে অপরের ঠিক পাশেই (বা উপরে), তাই অফসেটটি জানা সময়সীমার সাথে সম্পর্কিত কিনা তা নির্ধারণ করার জন্য পর্যাপ্ত নয়।

এবং ইউটিসির কী হবে? ঠিক আছে, এটি সেখানে একটি ক্যামেরা যা স্থির হাত রাখার গ্যারান্টিযুক্ত। এটি একটি ত্রিপডে আছে, দৃly়ভাবে মাটিতে নোঙ্গর করা। এটি কোথাও যাচ্ছে না। আমরা এর দৃষ্টিভঙ্গির কোণটিকে শূন্য অফসেট বলি।

তাত্ক্ষণিক সময় বনাম ক্যালেন্ডারের সময় ভিজ্যুয়ালাইজেশন

সুতরাং - এই উপমাটি আমাদের কী বলে? এটি কিছু স্বজ্ঞাত গাইডলাইন সরবরাহ করে-

  • আপনি যদি বিশেষভাবে কোনও জায়গার তুলনায় সময় উপস্থাপন করছেন তবে এটি ক্যালেন্ডারের সময়ে একটি সহ উপস্থাপন করুন DateTime। কেবলমাত্র নিশ্চিত হন যে আপনি কখনই একটি ক্যালেন্ডারকে অন্য ক্যালেন্ডারে বিভ্রান্ত করেন না। Unspecifiedআপনার অনুমান করা উচিত। Localথেকে আসা শুধুমাত্র দরকারী DateTime.Now। উদাহরণস্বরূপ, আমি DateTime.Nowএটি একটি ডাটাবেসে পেতে এবং সেভ করতে পারি - তবে যখন আমি এটি পুনরুদ্ধার করি তখন আমাকে ধরে নিতে হবে যে এটি Unspecified। আমি নির্ভর করতে পারি না যে আমার স্থানীয় ক্যালেন্ডারটি একই ক্যালেন্ডারটি এটি থেকে নেওয়া হয়েছিল taken

  • আপনি যদি অবশ্যই সর্বদা মুহুর্তের বিষয়ে নিশ্চিত হন তবে নিশ্চিত হন যে আপনি তাত্ক্ষণিক সময়ের প্রতিনিধিত্ব করছেন। ব্যবহারের DateTimeOffsetআইন বলবত্, অথবা ইউটিসি ব্যবহার করতে DateTimeকনভেনশন দ্বারা।

  • আপনার যদি তাত্ক্ষণিক সময়ের একটি মুহূর্ত ট্র্যাক করতে হয় তবে আপনি এটিও জানতে চান "ব্যবহারকারী তাদের স্থানীয় ক্যালেন্ডারে এটি কী সময় মনে করেছিল?" - তাহলে আপনাকে অবশ্যই একটি ব্যবহার করতে হবেDateTimeOffset । এটি টাইমকিপিং সিস্টেমগুলির জন্য খুব গুরুত্বপূর্ণ, উদাহরণস্বরূপ - প্রযুক্তিগত এবং আইনী উদ্বেগ উভয়ের জন্য।

  • আপনার যদি কখনও পূর্বে রেকর্ডকৃত সংশোধন DateTimeOffsetকরতে হয় - নতুন অফসেটটি এখনও ব্যবহারকারীর জন্য প্রাসঙ্গিক কিনা তা নিশ্চিত করতে আপনার একা অফসেটে পর্যাপ্ত তথ্য নেই। আপনি আবশ্যক এছাড়াও একটি সময় অঞ্চল আইডেন্টিফায়ার দোকান (মনে - আমি যে ক্যামেরা নামে প্রয়োজন তাই আমি একটি নতুন ছবি নিতে পারেন এমনকি যদি অবস্থান পরিবর্তিত হয়েছে)।

    এটিও উল্লেখ করা উচিত যে নোদা সময়ের জন্য এটির জন্য একটি প্রতিনিধিত্ব রয়েছে ZonedDateTime, যখন নেট বেস ক্লাসের লাইব্রেরির অনুরূপ কিছু নেই। আপনার একটি DateTimeOffsetএবং TimeZoneInfo.Idমান উভয়ই সঞ্চয় করতে হবে ।

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

DateTimeOffsetএই উপমাটি ব্যাক আপ করার বিষয়ে এখানে কয়েকটি আরও কয়েকটি বিট দেওয়া হয়েছে এবং এটিকে সোজা রাখার জন্য কিছু টিপস:

  • আপনি যদি দুটি DateTimeOffsetমান তুলনা করেন তবে তুলনা করার আগে সেগুলি প্রথমে শূন্য অফসেটে স্বাভাবিক করা হয়। অন্য কথায়, 2012-01-01T00:00:00+00:00এবং 2012-01-01T02:00:00+02:00একই তাত্ক্ষণিক মুহুর্তটি উল্লেখ করুন এবং তাই সমান।

  • যদি আপনি কোন ইউনিট টেস্টিং এবং প্রয়োজন করছ তাহলে অফসেট, পরীক্ষার নির্দিষ্ট করা উভয়DateTimeOffset মান, এবং .Offsetআলাদাভাবে সম্পত্তি।

  • । নেট ফ্রেমওয়ার্কটিতে একটি একমুখী অন্তর্নিহিত রূপান্তর রয়েছে যা আপনাকে DateTimeকোনও DateTimeOffsetপ্যারামিটার বা ভেরিয়েবলের মধ্যে যেতে দেয়। তা করার বিষয়ে । আপনি যদি কোনও ইউটিসি ধরনের পাস করেন তবে এটি শূন্য অফসেট সহ বহন করবে, তবে আপনি যদি পাস করেন বা হয় তবে এটি স্থানীয় বলে ধরে নেওয়া হবে । কাঠামোটি মূলত বলছে, "আচ্ছা, আপনি আমাকে ক্যালেন্ডারের সময়টিকে তাত্ক্ষণিক সময়ে রূপান্তর করতে বলেছিলেন, তবে কোথা থেকে এসেছে তা আমার কোনও ধারণা নেই, তাই আমি কেবল স্থানীয় ক্যালেন্ডারটি ব্যবহার করব।" আপনি যদি কোনও আলাদা টাইমজোন দিয়ে কোনও কম্পিউটারে অনির্ধারিতভাবে লোড করেন তবে এটি একটি বিশাল গোটচা । (আইএমএইচও - এটি একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত - তবে তা হয় না)).Kind.Local.UnspecifiedDateTime

নির্লজ্জ প্লাগ:

অনেক লোক আমার সাথে ভাগ করে নিয়েছেন যে তারা এই উপমাটি অত্যন্ত মূল্যবান বলে মনে করেন, তাই আমি এটিকে আমার বহুবচন স্থান, তারিখ এবং সময় মৌলিক বিষয়গুলিতে অন্তর্ভুক্ত করেছি । "ক্যালেন্ডার টাইম বনাম তাত্ক্ষণিক সময়" শিরোনামের ক্লিপটিতে আপনি দ্বিতীয় মডিউল "প্রসঙ্গ বিষয়গুলি" তে ক্যামেরার সাদৃশ্যটির একটি ধাপে ধাপে পদক্ষেপ পাবেন'll


4
@ জ্যাক জ্যানজেন যদি আপনার DateTimeOffsetসি # তে থাকে তবে আপনার DATETIMEOFFSETএসকিউএল সার্ভারে এটি চালিয়ে যাওয়া উচিত । DATETIME2বা কেবল DATETIME(প্রয়োজনীয় ব্যাপ্তির উপর নির্ভর করে) নিয়মিত DateTimeমানগুলির জন্য সূক্ষ্ম । হ্যাঁ - আপনি যেকোন সময় টাইমজোন + ডিটিও বা ইউটিসি থেকে স্থানীয় সময় সমাধান করতে পারেন। পার্থক্যটি হ'ল - আপনি কি সর্বদা প্রতিটি সংকল্পের সাথে নিয়মগুলি গণনা করতে চান, বা আপনি সেগুলি প্রাক্কলিত করতে চান? অনেক ক্ষেত্রে (কখনও কখনও আইনী উদ্বেগের জন্য) একটি ডিটিও আরও ভাল পছন্দ।
ম্যাট জনসন-পিন্ট

3
@ জ্যাকজানসেন আপনার প্রশ্নের দ্বিতীয় অংশের জন্য, আমি যতটা সম্ভব সার্ভার-সাইডটি করার পরামর্শ দিচ্ছি। টাইমজোন গণনার জন্য জাভাস্ক্রিপ্ট এত বড় নয়। আপনার যদি এটি অবশ্যই করতে হয় তবে এই লাইব্রেরির একটি ব্যবহার করুন । তবে সার্ভারের দিকটি সবচেয়ে ভাল। আপনার যদি আরও বিশদ প্রশ্ন থাকে তবে দয়া করে তাদের জন্য একটি নতুন এসও প্রশ্ন শুরু করুন এবং আমি পারলে উত্তর দেব। ধন্যবাদ।
ম্যাট জনসন-পিন্ট

4
@ জোয়াওলিম - আপনি কোথা থেকে এটি পেয়েছেন তা নির্ভর করে। আপনি ঠিক বলেছেন যে আপনি যদি DateTimeOffset.Nowসার্ভারে বলেন, আপনি প্রকৃতপক্ষে সার্ভারটির অফসেট পাবেন। পয়েন্টটি হ'ল DateTimeOffsetটাইপটি সেই অফসেটটি ধরে রাখতে পারে। আপনি ক্লায়েন্টে ঠিক এটি সহজেই করতে পারতেন, এটি সার্ভারে প্রেরণ করুন এবং তারপরে আপনার সার্ভারটি ক্লায়েন্টের অফসেটটি জানতে পারে।
ম্যাট জনসন-পিন্ট

8
সত্যিই ক্যামেরা উপমাটি ভালোবাসি love
শচীন কৈথ 14

2
হ্যাঁ, এটা সঠিক। ডিটিওটি (স্থানীয় সময়, অফসেট) জুটি হিসাবে সংরক্ষণ করা হয়, (উত্স সময়, অফসেট) জুটি হিসাবে নয়। অন্য কথায়, ইউটিসি থেকে অফসেটটি ইতিমধ্যে স্থানীয় সময়ে প্রতিফলিত হয়েছে। ইউটিসিতে ফিরে রূপান্তর করতে, অফসেটের চিহ্নটি উল্টে দিন এবং স্থানীয় সময় এটি প্রয়োগ করুন।
ম্যাট জনসন-পিন্ট

328

মাইক্রোসফ্ট থেকে:

ডেটটাইম অফসেট মানগুলির জন্য এই ব্যবহারগুলি ডেটটাইম মানগুলির তুলনায় অনেক বেশি সাধারণ। ফলস্বরূপ, ডেটটাইমঅফসেটটিকে অ্যাপ্লিকেশন বিকাশের জন্য ডিফল্ট তারিখ এবং সময় প্রকার হিসাবে বিবেচনা করা উচিত।

উত্স: "ডেটটাইম, ডেটটাইম অফসেট, টাইমস্প্যান এবং টাইমজোনইনফো এর মধ্যে নির্বাচন করা" , এমএসডিএন

DateTimeOffsetআমাদের অ্যাপ্লিকেশন সময় নির্দিষ্ট পয়েন্টগুলির সাথে সম্পর্কিত হিসাবে আমরা প্রায় সমস্ত কিছুর জন্য ব্যবহার করি (যেমন যখন কোনও রেকর্ড তৈরি / আপডেট করা হয়েছিল)। পার্শ্ব নোট হিসাবে, আমরা DATETIMEOFFSETএসকিউএল সার্ভার ২০০৮-তেও ব্যবহার করি ।

আমি কার্যকর DateTimeহিসাবে দেখি যখন আপনি কেবল তারিখগুলি, কেবলমাত্র বারের সাথে লেনদেন করতে চান বা সাধারণভাবে বিবেচনা করতে চান। উদাহরণস্বরূপ, যদি আপনি একটি অ্যালার্ম আছে আপনি 7 টায় প্রতিদিন বন্ধ যেতে চাই, আপনি সংরক্ষণ করতে পারে যে একটি DateTimeএকটি ব্যবহার DateTimeKindএর Unspecifiedকারণে এটি ডিএসটি নির্বিশেষে সকাল 7 টায় বন্ধ যেতে চাই। তবে আপনি যদি অ্যালার্ম সংঘটনগুলির ইতিহাস উপস্থাপন করতে চান তবে আপনি এটি ব্যবহার করবেন DateTimeOffset

কোনও মিশ্রণ ব্যবহার করার সময় DateTimeOffsetএবং DateTimeবিশেষত যখন ধরণেরগুলির মধ্যে নির্ধারণ এবং তুলনা করার সময় সাবধানতা অবলম্বন করুন । এছাড়াও, কেবল DateTimeএকই উদাহরণগুলি তুলনা করুন DateTimeKindকারণ DateTimeতুলনা করার সময় টাইমজোন অফসেটটিকে উপেক্ষা করে।


146
গৃহীত উত্তর অত্যধিক দীর্ঘ এবং সাদৃশ্যটি স্ট্রেইন, এটি একটি আরও ভাল এবং আরও সংক্ষিপ্ত উত্তর আইএমও।
নেক্সাস

10
আমি কেবল বলব যে আমি এই উত্তরটিও পছন্দ করি, এবং উত্সাহিত। যদিও শেষ অংশে - এমনকি নিশ্চিত করা Kindএকই হয় তবে তুলনা ত্রুটি হতে পারে। উভয় পক্ষের যদি DateTimeKind.Unspecifiedআপনি সত্যিই জানেন না যে তারা একই সময় অঞ্চল থেকে এসেছিল। উভয় পক্ষের হন DateTimeKind.Local, সবচেয়ে তুলনা জরিমানা হতে যাচ্ছে, কিন্তু আপনি এখনও ত্রুটি থাকতে পারে একপাশে স্থানীয় সময় অঞ্চলে দ্ব্যর্থক নয়। সত্যই কেবল DateTimeKind.Utcতুলনাগুলি নির্বোধ এবং হ্যাঁ DateTimeOffsetসাধারণত পছন্দ হয়। (চিয়ার্স!)
ম্যাট জনসন-পিন্ট

1
+1 আমি এটিতে যুক্ত করব: আপনার চয়ন করা ডেটা টাইপটি আপনার উদ্দেশ্যটি প্রতিফলিত করবে। ডেটটাইম অফসেটটি যে কোনও জায়গায় ব্যবহার করবেন না, কেবল কারণ। যদি অফসেট আপনার গণনা এবং রিডিং-থেকে / পার্সেস্টিং-থেকে ডেটাবেসের বিষয়টি বিবেচনা করে তবে ডেটটাইম অফসেট ব্যবহার করুন। যদি এটি বিবেচনা না করে তবে ডেটটাইমটি ব্যবহার করুন, সুতরাং আপনি বুঝতে পারবেন (কেবলমাত্র ডাটাটাইপটি দেখে) যে অফসেটটির কোনও ফলন নেই এবং টাইমসের সার্ভার / মেশিনের স্থানীয় অঞ্চলের সাথে আপনার সি # কোডটি চলছে should
মাইকটিভি

"তবে আপনি যদি অ্যালার্ম সংঘটনগুলির ইতিহাস উপস্থাপন করতে চান তবে আপনি ডেটটাইম অফসেট ব্যবহার করবেন" " আপনি কেন এটি মনে করেন তা ব্যাখ্যা করার যত্ন নেবেন? আমি এই পৃষ্ঠায় সমস্ত তথ্য পড়ার মাধ্যমে এটি পূরণ করতে পারে তবে আপনি পাশাপাশি পড়া সহজ পদ্ধতিতে এই জাতীয় তথ্য প্রদান করতে পারে। এটি একটি খুব পঠনযোগ্য উত্তর।
ব্যারোসি

77

ডেটটাইম স্থানীয় সময় এবং ইউটিসি, কেবল দুটি স্বতন্ত্র বার সঞ্চয় করতে সক্ষম। কাইন্ড সম্পত্তি যা নির্দেশ করে।

ডেটটাইম অফসেট বিশ্বের যে কোনও জায়গা থেকে স্থানীয় সময় সঞ্চয় করতে সক্ষম হয়ে এর উপর প্রসারিত হয়। এটি স্থানীয় সময় এবং ইউটিসির মধ্যে অফসেট সংরক্ষণ করে। নোটটাইম কীভাবে এটি করতে পারে না তা নোট করুন আপনি যদি না ইউটিসি অফসেটটি সঞ্চয় করতে নিজের ক্লাসে অতিরিক্ত সদস্য যুক্ত করেন। অথবা কেবল কখনও ইউটিসির সাথে কাজ করুন। যা নিজেই একটি সূক্ষ্ম ধারণা বিটিডব্লিউ।


33

এমন কয়েকটি জায়গা রয়েছে যেখানে DateTimeOffsetবোঝা যায়। একটি যখন আপনি পুনরাবৃত্তি ইভেন্ট এবং দিবালোক সঞ্চয় সময় নিয়ে কাজ করছেন। ধরা যাক আমি প্রতিদিন সকাল 9 টায় একটি অ্যালার্ম সেট করতে চাই। যদি আমি "ইউটিসি হিসাবে স্টোর ব্যবহার করি, স্থানীয় সময় হিসাবে প্রদর্শন করুন" নিয়মটি ব্যবহার করি তবে দিনের আলোর সঞ্চয়ের সময় কার্যকর হওয়ার সময় অ্যালার্মটি অন্য সময়ে বন্ধ হয়ে যাবে ।

অন্যরাও সম্ভবত আছেন, তবে উপরের উদাহরণটি আসলে একটি যা আমি অতীতে DateTimeOffsetচালিয়ে গিয়েছিলাম (এটি ছাত্রলীগের সাথে যুক্ত হওয়ার আগে ছিল - আমার সময়টির সমাধানটি ছিল স্পষ্টভাবে স্থানীয় সময় অঞ্চলটিতে সময় সংরক্ষণ এবং সংরক্ষণ করা টাইমজোন সম্পর্কিত তথ্য পাশাপাশি রাখুন: মূলত DateTimeOffsetঅভ্যন্তরীণভাবে কী করে)।



2
টাইমজোনআইফো ক্লাস ব্যবহার করা ডিএসটি-র জন্য নিয়ম বহন করে। যদি আপনি .net 3.5 বা তার পরে থাকেন তবে টাইমজোন অফসেটের সাথে ডাইলাইট সেভিংস সময়কে একত্রে হ্যান্ডেল করতে হবে এমন তারিখগুলি মোকাবেলা করতে টাইমজোন বা টাইমজোনআইএনফো ক্লাসগুলি ব্যবহার করুন।
জ্যাক জান্নসেন

1
হ্যাঁ একটি ব্যতিক্রম (অ্যালার্ম অ্যাপ্লিকেশন) এর ভাল উদাহরণ তবে সময়টির চেয়ে বেশি গুরুত্বপূর্ণ যখন আপনি সত্যিকার অর্থে অ্যাপ্লিকেশনটির জন্য আপনার সময়সূচী ডেটা কাঠামোতে পৃথক করে রাখেন, যেমন ঘটনা টাইপ = ডেইলি এবং সময় = 09:00। এখানে মূল বিষয়টি হ'ল বিকাশকারীকে তারা কী ধরণের তারিখ রেকর্ড করছে, গণনা করছে বা ব্যবহারকারীদের কাছে উপস্থাপন করছে তা সম্পর্কে সচেতন হওয়া দরকার। বিশেষত অ্যাপ্লিকেশনগুলি আরও বিশ্বব্যাপী হতে থাকে এখন আমাদের কাছে সফটওয়্যার লেখার জন্য স্ট্যান্ডার্ড এবং বড় অ্যাপ স্টোর হিসাবে ইন্টারনেট রয়েছে। পার্শ্ব নোড হিসাবে আমি মাইক্রোসফ্ট একটি পৃথক তারিখ এবং সময় কাঠামো যুক্ত দেখতে দেখতে চাই।
টনি ওয়াল

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

"এমন কয়েকটি জায়গা রয়েছে যেখানে ডেটটাইম অফসেটটি বোঝায়।" --- যুক্তিযুক্তভাবে, এটি প্রায়শই না বোঝার চেয়ে বেশি বোঝায়।
রনি ওভারবি

23

সর্বাধিক গুরুত্বপূর্ণ পার্থক্য হ'ল ডেটটাইম সময় অঞ্চল তথ্য সংরক্ষণ করে না, যখন ডেটটাইম অফসেট করে।

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

উদাহরণস্বরূপ, আপনি যদি জাইসন. নেট এবং কোনও আইএসও তারিখের বিন্যাস ব্যবহার করে Kind = স্থানীয় দিয়ে একটি ডেটটাইম মানটি ক্রমিক করে তোলেন তবে আপনি এর মতো একটি স্ট্রিং পাবেন 2015-08-05T07:00:00-04 । লক্ষ্য করুন যে শেষ অংশ (-04) এর সাথে আপনার ডেটটাইম বা কোনও অফসেট যা আপনি এটি গণনা করতেন তা করার কিছুই ছিল না ... এটি খাঁটিভাবে সার্ভারের টাইম জোন অফসেট।

এদিকে, ডেটটাইমঅফসেট স্পষ্টভাবে অফসেটটি অন্তর্ভুক্ত করে। এতে সময় অঞ্চলটির নাম অন্তর্ভুক্ত নাও হতে পারে তবে অন্তত এটিতে অফসেট অন্তর্ভুক্ত রয়েছে এবং আপনি যদি এটি সিরিয়ালাইজ করেন তবে সার্ভারের স্থানীয় সময় যা ঘটে তা পরিবর্তে আপনি আপনার মানটিতে স্পষ্টভাবে অন্তর্ভুক্ত অফসেট পেয়ে যাবেন।


14
উপরের সমস্ত উত্তর সহ, আমি অবাক হই যে কেন কেউ আপনার একক বাক্যটি যে এটির সমস্ত The most important distinction is that DateTime does not store time zone information, while DateTimeOffset does.
যোগফল দেয়

9
ডেটটাইমঅফসেট সময় অঞ্চল তথ্য সংরক্ষণ করে না। এমএস ডক শিরোনাম "ডেটটাইম, ডেটটাইমঅফসেট, টাইমস্প্যান, এবং টাইমজোনআইএনফো এর মধ্যে নির্বাচন করা" এই উক্তিটি নির্দিষ্ট করে: "একটি ডেটটাইমঅফসেট মান নির্দিষ্ট সময় অঞ্চলে আবদ্ধ হয় না, তবে বিভিন্ন সময় অঞ্চলগুলির মধ্যে থেকে উত্পন্ন হতে পারে"। এটি বলেছিল, ইউটিসি থেকে অফসেট সমেত ডেটটাইমঅফসেট আইএস টাইম জোন অ্যাওয়ার কোন নির্দিষ্ট সময়
অঞ্চলটি

1
হ্যাঁ, তবে যেমনটি অনেক জায়গায় প্রদর্শিত হয়েছে, + বা - ঘন্টা আপনি কী টাইমজোনে ছিলেন এবং শেষ পর্যন্ত অকেজো তা সম্পর্কে কিছুই বলে না। আপনার যা করা দরকার তার উপর নির্ভর করে আপনি ঠিক যেমন একটি ডেটটাইম সংরক্ষণ করতে পারেন ঠিক তেমনভাবেই n অস্পষ্টিত এবং তার টাইমজোনটির আইডি সংরক্ষণ করতে পারেন এবং আমি মনে করি আপনি আসলে আরও ভাল better
অরউইন

13

মাইক্রোসফ্টের কোডের এই অংশটি সমস্ত কিছু ব্যাখ্যা করেছে:

// Find difference between Date.Now and Date.UtcNow
  date1 = DateTime.Now;
  date2 = DateTime.UtcNow;
  difference = date1 - date2;
  Console.WriteLine("{0} - {1} = {2}", date1, date2, difference);

  // Find difference between Now and UtcNow using DateTimeOffset
  dateOffset1 = DateTimeOffset.Now;
  dateOffset2 = DateTimeOffset.UtcNow;
  difference = dateOffset1 - dateOffset2;
  Console.WriteLine("{0} - {1} = {2}", 
                    dateOffset1, dateOffset2, difference);
  // If run in the Pacific Standard time zone on 4/2/2007, the example
  // displays the following output to the console:
  //    4/2/2007 7:23:57 PM - 4/3/2007 2:23:57 AM = -07:00:00
  //    4/2/2007 7:23:57 PM -07:00 - 4/3/2007 2:23:57 AM +00:00 = 00:00:00

9

বেশিরভাগ উত্তর ভাল তবে আমি আরও তথ্যের জন্য এমএসডিএন এর আরও কয়েকটি লিঙ্ক যুক্ত করার কথা ভেবেছিলাম



7

একটি প্রধান পার্থক্য হ'ল বর্তমান সময়ের ব্যতীত অন্য সময় অঞ্চলগুলিতে স্থানীয় সময়ে রূপান্তর DateTimeOffsetকরতে ব্যবহার করা যেতে পারে TimeZoneInfo

এটি সার্ভার অ্যাপ্লিকেশনটিতে (যেমন ASP.NET) দরকারী যা বিভিন্ন টাইম জোনের ব্যবহারকারীদের দ্বারা অ্যাক্সেস করা হয়।


3
@ বুজিও বুজিও সত্য, তবে ঝুঁকি আছে। আপনি প্রতিটি "টু ইউনিভার্সালটাইম" কল করে দুটি ডেটটাইম তুলনা করতে পারেন। ডেটটাইমকিন্ড = অনির্ধারিত তুলনার তুলনায় আপনার যদি ঠিক একটি মান থাকে তবে আপনার কৌশলটি ব্যর্থ হবে। এই ব্যর্থতার সম্ভাবনা হ'ল স্থানীয় সময় রূপান্তর প্রয়োজন যখন ডেটটাইম ওভার ডেটটাইম অফফেস বিবেচনা করার কারণ।
জ্যাক জান্নসেন

উপরের মত, আমি এই দৃশ্যে মনে করি আপনি ডেটটাইমঅফসেট ব্যবহারের চেয়ে টাইমজোনআইডি সংরক্ষণের চেয়ে ভাল, যার শেষ পর্যন্ত কিছুই নেই।
অরউইন

2

ডেটটাইমঅফসেটের একমাত্র নেতিবাচক দিকটি আমি দেখতে পাচ্ছি যে মাইক্রোসফ্ট তাদের এক্সএমএসআররিয়াল ক্লাসে এটি সমর্থন করার জন্য "ভুলে গিয়েছে" (ডিজাইনের মাধ্যমে)। তবে এর পরে এটি এক্সএমএল রূপান্তর ইউটিলিটি ক্লাসে যুক্ত করা হয়েছে।

XmlConvert.ToDateTimeOffset

XmlConvert.ToString

আমি বলি যে এগিয়ে যান এবং সমস্ত সুবিধার কারণে ডেটটাইম অফসেট এবং টাইমজোনআইএনফো ব্যবহার করুন, সত্ত্বা তৈরি করার সময় সাবধান থাকুন যা এক্সএমএল থেকে বা এর পরে সিরিয়ালযুক্ত করা যেতে পারে (তখন সমস্ত ব্যবসায়ের জিনিসগুলি)।

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