C # .NET এর মধ্যে System.DateTime.Now
এবং পার্থক্যটি কি কেউ ব্যাখ্যা করতে পারেন System.DateTime.Today
? যদি সম্ভব হয় তবে প্রত্যেকের প্রো এবং কনস।
C # .NET এর মধ্যে System.DateTime.Now
এবং পার্থক্যটি কি কেউ ব্যাখ্যা করতে পারেন System.DateTime.Today
? যদি সম্ভব হয় তবে প্রত্যেকের প্রো এবং কনস।
উত্তর:
DateTime.Now
DateTime
কোডটি চলছে এমন কম্পিউটারের স্থানীয় তারিখ এবং সময় সমন্বিত একটি মান প্রদান করে। এটি DateTimeKind.Local
তার Kind
সম্পত্তি বরাদ্দ করেছে । এটি নিম্নলিখিত যে কোনওটিকে কল করার সমতুল্য:
DateTime.UtcNow.ToLocalTime()
DateTimeOffset.UtcNow.LocalDateTime
DateTimeOffset.Now.LocalDateTime
TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local)
TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local)
DateTime.Today
DateTime
উপরের মত প্রকাশের যে কোনও একটি হিসাবে একই বছর, মাস এবং দিনের উপাদান রয়েছে এমন একটি মান প্রদান করে তবে সময় উপাদান শূন্যে সেট করা থাকে। এছাড়া রয়েছে DateTimeKind.Local
তার মধ্যে Kind
সম্পত্তি। এটি নিম্নলিখিত যে কোনওটির সমতুল্য:
DateTime.Now.Date
DateTime.UtcNow.ToLocalTime().Date
DateTimeOffset.UtcNow.LocalDateTime.Date
DateTimeOffset.Now.LocalDateTime.Date
TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local).Date
TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local).Date
নোট করুন যে অভ্যন্তরীণভাবে, সিস্টেমের ঘড়িটি ইউটিসির শর্তাবলী, সুতরাং আপনি যখন DateTime.Now
এটি কল করবেন প্রথমে ইউটিসি সময় হবে ( GetSystemTimeAsFileTime
উইন 32 এপিআইয়ের ফাংশনের মাধ্যমে ) এবং তারপরে এটি মানটিকে স্থানীয় সময় অঞ্চলে রূপান্তর করে। (সুতরাং এর DateTime.Now.ToUniversalTime()
চেয়ে বেশি ব্যয়বহুল DateTime.UtcNow
))
এছাড়াও নোট করুন যে এর সাথে DateTimeOffset.Now.DateTime
একই মান থাকবে DateTime.Now
, তবে এটির DateTimeKind.Unspecified
পরিবর্তে এটি হবে DateTimeKind.Local
- যা আপনি এটি দিয়ে যা করেন তার উপর নির্ভর করে অন্যান্য ত্রুটি হতে পারে।
সুতরাং, সহজ উত্তর DateTime.Today
এটি সমতুল্য DateTime.Now.Date
।
তবে আইএমএইচও - আপনার এইগুলির মধ্যে একটি বা উপরের সমতুল্য কোনওটি ব্যবহার করা উচিত নয়।
আপনি যখন জিজ্ঞাসা করবেন DateTime.Now
, আপনি কোডটি চালাচ্ছেন এমন কম্পিউটারের স্থানীয় ক্যালেন্ডার ঘড়ির মূল্য জিজ্ঞাসা করছেন। তবে আপনি যা ফিরে পাবেন তার সেই ঘড়ির কোনও তথ্য নেই! আপনি যে সেরা পাবেন তা হ'ল DateTime.Now.Kind == DateTimeKind.Local
। তবে এটি কার স্থানীয়? মানটি দিয়ে কোনও কিছু করার সাথে সাথে এই তথ্যটি হারিয়ে যায়, যেমন এটি কোনও ডেটাবেজে সংরক্ষণ করে, স্ক্রিনে প্রদর্শন করতে, বা ওয়েব পরিষেবা ব্যবহার করে সঞ্চারিত করে।
যদি আপনার স্থানীয় সময় অঞ্চল কোনও দিবালোক সংরক্ষণের নিয়ম অনুসরণ করে তবে আপনি সেই তথ্যটি আর ফিরে পাবেন না DateTime.Now
। অস্পষ্ট সময়ে যেমন "ফ্যাল-ব্যাক" ট্রানজিশনের সময় আপনি জানতে পারবেন না যে দুটি সম্ভাব্য মুহুর্তের মধ্যে কোনটি আপনি যে মূল্য অর্জন করেছেন তার সাথে মিল রাখে DateTime.Now
। উদাহরণস্বরূপ, বলুন যে আপনার সিস্টেমের সময় অঞ্চল সেট করা আছে Mountain Time (US & Canada)
এবং আপনি ২ রা DateTime.Now
নভেম্বর, ২০১৩ এর প্রথম দিকে জিজ্ঞাসা করুন the ফলাফলটির 2013-11-03 01:00:00
অর্থ কী? এই একই ক্যালেন্ডারের তারিখের সময় দ্বারা প্রতিনিধিত্ব করা তাত্ক্ষণিক সময়ের দুটি মুহুর্ত রয়েছে। আমি যদি এই মানটি অন্য কারও কাছে প্রেরণ করি তবে তাদের কোন ধারণা নেই যে আমি কোনটি বোঝাতে চাইছি। বিশেষত যদি তারা এমন টাইম জোনে থাকে যেখানে নিয়মগুলি আলাদা।
DateTimeOffset
পরিবর্তে ব্যবহার করা আপনি সবচেয়ে ভাল কাজটি করতে পারেন :
// This will always be unambiguous.
DateTimeOffset now = DateTimeOffset.Now;
এখন আমি উপরে বর্ণিত একই দৃশ্যের জন্য, আমি 2013-11-03 01:00:00 -0600
স্থানান্তরের আগে বা 2013-11-03 01:00:00 -0700
সংক্রমণের পরে মানটি পাই । এই মানগুলির দিকে তাকানো যে কেউ বলতে চাইলে আমি বলতে চাইছি।
আমি এই বিষয়ে একটি ব্লগ পোস্ট লিখেছি। দয়া করে পড়ুন - তারিখের বিরুদ্ধে মামলা.এখন ।
এছাড়াও, এই বিশ্বে কিছু জায়গা রয়েছে (যেমন ব্রাজিল) যেখানে "স্প্রিং-ফরোয়ার্ড" ট্রানজিশন হ'ল মধ্যরাতে। ঘড়িগুলি 23:59 থেকে 01:00 পর্যন্ত চলে। এর অর্থ হল যে DateTime.Today
তারিখে আপনি যে মূল্যটি পাবেন , তা বিদ্যমান নেই! এমনকি যদি আপনি ব্যবহার করেন তবে আপনি DateTimeOffset.Now.Date
একই ফলাফল পেয়ে যাচ্ছেন এবং আপনার এখনও এই সমস্যা রয়েছে। এটি traditionতিহ্যগতভাবে কারণেই Date
। নেট এ কোনও বস্তুর মতো কিছুই হয়নি । সুতরাং আপনি মূল্যটি কীভাবে অর্জন করবেন তা নির্বিশেষে একবার সময় সরিয়ে নেওয়ার পরে - আপনাকে মনে রাখতে হবে যে এটি আপনার সাথে কাজ করছেন এমনকী মূল্য থাকা সত্ত্বেও এটি "মধ্যরাত" উপস্থাপন করে না।
আপনি যদি এই সমস্যার পুরোপুরি সঠিক সমাধান চান তবে নোডটাইম ব্যবহার করা সবচেয়ে ভাল উপায় । LocalDate
বর্গ সঠিকভাবে একটি সময় ছাড়া একটি তারিখ প্রতিনিধিত্ব করে। স্থানীয় সিস্টেমের সময় অঞ্চল সহ আপনি যে কোনও সময় অঞ্চলের জন্য বর্তমান তারিখটি পেতে পারেন:
using NodaTime;
...
Instant now = SystemClock.Instance.Now;
DateTimeZone zone1 = DateTimeZoneProviders.Tzdb.GetSystemDefault();
LocalDate todayInTheSystemZone = now.InZone(zone1).Date;
DateTimeZone zone2 = DateTimeZoneProviders.Tzdb["America/New_York"];
LocalDate todayInTheOtherZone = now.InZone(zone2).Date;
আপনি যদি নোডা সময় ব্যবহার করতে না চান তবে এখন আর একটি বিকল্প রয়েছে। । নেট কোরএফএক্স ল্যাব প্রকল্পে কেবলমাত্র তারিখের অবজেক্টের প্রয়োগের জন্য আমি অবদান রেখেছি । আপনি System.Time
তাদের মাইগেট ফিডে প্যাকেজ অবজেক্টটি সন্ধান করতে পারেন । আপনার প্রকল্পে একবার যুক্ত হয়ে গেলে আপনি নীচের যে কোনও একটি করতে পারেন তা দেখতে পাবেন:
using System;
...
Date localDate = Date.Today;
Date utcDate = Date.UtcToday;
Date tzSpecificDate = Date.TodayInTimeZone(anyTimeZoneInfoObject);
DateTime.UtcNow
আপনি যদি আপনার অ্যাপ্লিকেশনটি জানাতে পারেন বা মানটি ইউটিসি-তে রয়েছে তা অনুমান করতে পারলে তা গ্রহণযোগ্য। (আমি আসলে ক্ষেত্র বা সম্পত্তিকে MyDateUtc
কেবলমাত্র পরিবর্তে কিছু কল করতে চাই MyDate
- তবে এটি কেবল কেকের উপরে আইসিং রয়েছে)) আপনি যদি তা অনুমান বা ক্ষেত্রের নামে প্রকাশ করতে না DateTimeOffset.UtcNow
পারেন তবে শূন্য অফসেটটি পৌঁছে দেওয়ার বিষয়টি নিশ্চিত করতে ব্যবহার করা যেতে পারে তারিখ এবং সময় মান সহ।
DateTime.Now.Date
।
সময়। .Now
09:23:12 বা যা কিছু অন্তর্ভুক্ত; .Today
কেবলমাত্র তারিখ-অংশ (সেদিন 00:00:00 এ)।
আপনি .Now
যদি সময় অন্তর্ভুক্ত করতে চান তবে ব্যবহার করুন , এবং .Today
যদি আপনি কেবল তারিখটি চান!
.Today
মূলত হিসাবে একই .Now.Date
UtcNow
যদি না আপনি সত্যিই সিস্টেম স্থানীয় সময় অঞ্চল চাই। (বিশেষত, কোনও ওয়েব অ্যাপ্লিকেশনে যা প্রায়শই ভুল পছন্দ))
DateTime.Now
সম্পত্তি বর্তমান তারিখ এবং সময়, উদাহরণস্বরূপ ফেরৎ 2011-07-01 10:09.45310
।
DateTime.Today
সম্পত্তি উদাহরণস্বরূপ শুন্যতে সেট সময় compnents সঙ্গে বর্তমান তারিখ ফেরৎ, 2011-07-01 00:00.00000
।
DateTime.Today
সম্পত্তি আসলে রিটার্ন বাস্তবায়িত হয় DateTime.Now.Date
:
public static DateTime Today {
get {
DateTime now = DateTime.Now;
return now.Date;
}
}
DateTime.Today টাইম পার্টটি 00:00:00 এ সেট করে বর্তমান সিস্টেমের তারিখটি উপস্থাপন করে
এবং
ডেটটাইম.নাউ বর্তমান সিস্টেমের তারিখ এবং সময়কে উপস্থাপন করে
(v=VS.100)
।
আমি এই লিঙ্কগুলি যুক্ত করার কথা ভেবেছিলাম -
মূল প্রশ্নে ফিরে আসছি, রিফ্লেক্টর ব্যবহার করে আমি কোডের পার্থক্যটি ব্যাখ্যা করেছি
public static DateTime Today
{
get
{
return DateTime.Now.Date; // It returns the date part of Now
//Date Property
// returns same date as this instance, and the time value set to 12:00:00 midnight (00:00:00)
}
}
private const long TicksPerMillisecond = 10000L;
private const long TicksPerDay = 864000000000L;
private const int MillisPerDay = 86400000;
public DateTime Date
{
get
{
long internalTicks = this.InternalTicks; // Date this instance is converted to Ticks
return new DateTime((ulong) (internalTicks - internalTicks % 864000000000L) | this.InternalKind);
// Modulo of TicksPerDay is subtracted - which brings the time to Midnight time
}
}
public static DateTime Now
{
get
{
/* this is why I guess Jon Skeet is recommending to use UtcNow as you can see in one of the above comment*/
DateTime utcNow = DateTime.UtcNow;
/* After this i guess it is Timezone conversion */
bool isAmbiguousLocalDst = false;
long ticks1 = TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc(utcNow, out isAmbiguousLocalDst).Ticks;
long ticks2 = utcNow.Ticks + ticks1;
if (ticks2 > 3155378975999999999L)
return new DateTime(3155378975999999999L, DateTimeKind.Local);
if (ticks2 < 0L)
return new DateTime(0L, DateTimeKind.Local);
else
return new DateTime(ticks2, DateTimeKind.Local, isAmbiguousLocalDst);
}
}
DateTime.Today
হয় DateTime.Now
শুন্যতে সেট সময়ের সাথে সাথে।
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে একটি ডেটটাইম মানের মধ্যে পার্থক্য রয়েছে, যা 1 জানুয়ারী, 0000 এর মধ্যরাত থেকে যে টিক্সের সংখ্যা কেটে গেছে এবং সেই তারিখটাইম মানটির স্ট্রিং প্রতিনিধিত্ব করে, যা একটি তারিখ এবং সময় মানকে প্রকাশ করে সংস্কৃতি-নির্দিষ্ট-নির্দিষ্ট ফর্ম্যাট: https://msdn.microsoft.com/en-us/library/system.datetime.now%28v=vs.110%29.aspx
DateTime.Now.Ticks
। নেট (মূলত ইউটিসি সময়) দ্বারা সঞ্চিত প্রকৃত সময়, বাকিগুলি কেবল উপস্থাপনা (যা প্রদর্শনের উদ্দেশ্যে গুরুত্বপূর্ণ)।
যদি Kind
সম্পত্তি DateTimeKind.Local
এটি পরোক্ষভাবে স্থানীয় কম্পিউটার এর সময় অঞ্চল তথ্য রয়েছে। একটি নেট নেট সার্ভিসে প্রেরণ করার সময়, ডেটটাইম মানগুলি ডিফল্টরূপে টাইম জোনের তথ্য অন্তর্ভুক্ত করে যেমন সিরিজ করা হয় যেমন 2008-10-31T15: 07: 38.6875000-05: 00, এবং অন্য সময় অঞ্চলের একটি কম্পিউটার এখনও ঠিক কী সময়টি জানতে পারে উল্লেখ করা হচ্ছে।
সুতরাং, ডেটটাইম.নিউ এবং ডেটটাইম ব্যবহার করুন। আজ পুরোপুরি ঠিক আছে।
আপনি যখন সত্যিকারের মানটির সাথে স্ট্রিং উপস্থাপনাকে বিভ্রান্ত করতে শুরু করেন এবং ডেটটাইমটি যখন এটি ভেঙে না যায়, তখন "ঠিক" করার চেষ্টা করার সময় আপনি সাধারণত সমস্যায় পড়তে শুরু করেন।
DateTime.UtcNow
পরিবর্তে ব্যবহার সম্পর্কে কিDateTimeOffset.Now
?