System.DateTime.Now এবং System.DateTime.Today এর মধ্যে পার্থক্য


127

C # .NET এর মধ্যে System.DateTime.Nowএবং পার্থক্যটি কি কেউ ব্যাখ্যা করতে পারেন System.DateTime.Today? যদি সম্ভব হয় তবে প্রত্যেকের প্রো এবং কনস।

উত্তর:


179

DateTime.NowDateTimeকোডটি চলছে এমন কম্পিউটারের স্থানীয় তারিখ এবং সময় সমন্বিত একটি মান প্রদান করে। এটি 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.TodayDateTimeউপরের মত প্রকাশের যে কোনও একটি হিসাবে একই বছর, মাস এবং দিনের উপাদান রয়েছে এমন একটি মান প্রদান করে তবে সময় উপাদান শূন্যে সেট করা থাকে। এছাড়া রয়েছে 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);

9
DateTime.UtcNowপরিবর্তে ব্যবহার সম্পর্কে কি DateTimeOffset.Now?
স্যামুয়েল লিউ

5
DateTime.UtcNowআপনি যদি আপনার অ্যাপ্লিকেশনটি জানাতে পারেন বা মানটি ইউটিসি-তে রয়েছে তা অনুমান করতে পারলে তা গ্রহণযোগ্য। (আমি আসলে ক্ষেত্র বা সম্পত্তিকে MyDateUtcকেবলমাত্র পরিবর্তে কিছু কল করতে চাই MyDate- তবে এটি কেবল কেকের উপরে আইসিং রয়েছে)) আপনি যদি তা অনুমান বা ক্ষেত্রের নামে প্রকাশ করতে না DateTimeOffset.UtcNowপারেন তবে শূন্য অফসেটটি পৌঁছে দেওয়ার বিষয়টি নিশ্চিত করতে ব্যবহার করা যেতে পারে তারিখ এবং সময় মান সহ।
ম্যাট জনসন-পিন্ট

তারা সমান নয়। আজ সময় ছিল 00:00:00 হিসাবে।
জেমস উইলকিন্স

@ জেমস উইলকিনস - আপনি কী পাচ্ছেন তা নিশ্চিত নয়। তাই করে DateTime.Now.Date
ম্যাট জনসন-পিন্ট

@ ম্যাটজহানসন প্রশ্নটি ডেটটাইম.আজ টোডে এবং ডেটটাইম.এর মধ্যে পার্থক্য জিজ্ঞাসা করছে, এখন ডেটটাইম নয়, টোডে এবং ডেটটাইম.নো ডেট।
ডেভিড অ্যান্ডারসন

85

সময়। .Now09:23:12 বা যা কিছু অন্তর্ভুক্ত; .Todayকেবলমাত্র তারিখ-অংশ (সেদিন 00:00:00 এ)।

আপনি .Nowযদি সময় অন্তর্ভুক্ত করতে চান তবে ব্যবহার করুন , এবং .Todayযদি আপনি কেবল তারিখটি চান!

.Today মূলত হিসাবে একই .Now.Date


27
... এবং ব্যবহার UtcNowযদি না আপনি সত্যিই সিস্টেম স্থানীয় সময় অঞ্চল চাই। (বিশেষত, কোনও ওয়েব অ্যাপ্লিকেশনে যা প্রায়শই ভুল পছন্দ))
জন স্কিটি

22

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;
  }
}

9

DateTime.Today টাইম পার্টটি 00:00:00 এ সেট করে বর্তমান সিস্টেমের তারিখটি উপস্থাপন করে

এবং

ডেটটাইম.নাউ বর্তমান সিস্টেমের তারিখ এবং সময়কে উপস্থাপন করে


2
কেবলমাত্র একটি পর্যবেক্ষণ ... ১.১ ডকুমেন্টেশন তারপরে 4.0 ডকুমেন্টেশনের চেয়ে অনেক কম বিশদ; ভিএলটেস্টের সাথে লিঙ্ক করা কি আরও ভাল?
মার্ক গ্র্যাভেল

3
@ মেগাপেললজ: আপনি এখন ভিএলটেস্টের পরিবর্তে ৪.০ এর সাথে সংযোগ করছেন। ভিএলটেস্ট লিঙ্কগুলি মুছে ফেলে তৈরি করা যেতে পারে (v=VS.100)
ব্রায়ান

6

আমি এই লিঙ্কগুলি যুক্ত করার কথা ভেবেছিলাম -

মূল প্রশ্নে ফিরে আসছি, রিফ্লেক্টর ব্যবহার করে আমি কোডের পার্থক্যটি ব্যাখ্যা করেছি

 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);
          }
        }

5
DateTime dt = new DateTime();// gives 01/01/0001 12:00:00 AM
DateTime dt = DateTime.Now;// gives today date with current time
DateTime dt = DateTime.Today;// gives today date and 12:00:00 AM time

1

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, এবং অন্য সময় অঞ্চলের একটি কম্পিউটার এখনও ঠিক কী সময়টি জানতে পারে উল্লেখ করা হচ্ছে।

সুতরাং, ডেটটাইম.নিউ এবং ডেটটাইম ব্যবহার করুন। আজ পুরোপুরি ঠিক আছে।

আপনি যখন সত্যিকারের মানটির সাথে স্ট্রিং উপস্থাপনাকে বিভ্রান্ত করতে শুরু করেন এবং ডেটটাইমটি যখন এটি ভেঙে না যায়, তখন "ঠিক" করার চেষ্টা করার সময় আপনি সাধারণত সমস্যায় পড়তে শুরু করেন।


-1

DateTime.Now.ToShortDateString() শুধুমাত্র তারিখের অংশটি প্রদর্শন করবে

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