ডেটটাইম "নাল" মান


273

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

উত্তর:


420

সাধারণ ডেটটাইমসের জন্য, আপনি যদি এগুলি DateTime.MinValueএকেবারে আরম্ভ না করেন তবে সেগুলি মিলবে , কারণ এটি কোনও রেফারেন্স টাইপের পরিবর্তে মান ধরণের।

আপনি এর মতো নালামের ডেটটাইমও ব্যবহার করতে পারেন:

DateTime? MyNullableDate;

বা লম্বা ফর্ম:

Nullable<DateTime> MyNullableDate;

এবং, অবশেষে, কোনও প্রকারের ডিফল্টটিকে রেফারেন্স করার জন্য একটি বিল্ট রয়েছে। এটি nullরেফারেন্সের ধরণের জন্য প্রত্যাবর্তন করে তবে আমাদের ডেটটাইম উদাহরণের জন্য এটি এর মতো ফিরে আসবে DateTime.MinValue:

default(DateTime)

অথবা, সি # এর আরও সাম্প্রতিক সংস্করণগুলিতে

default

8
আপনি কীভাবে এটি ব্যবহার করবেন তার একটি উদাহরণ সরবরাহ করলে এটি ব্যাপকভাবে সহায়তা করবে। ডাটাবেসে আপনি ডেটটাইম কীভাবে নির্ধারণ করবেন, যা DBNull হতে পারে, ডেটটাইমকে ডেকে আনে?
কিরক.বার্লসন

9
এটি লক্ষ্য করাও ভাল যে আপনি যখন এগুলি আরম্ভ করবেন এবং DateTime.MinValue
শূন্যতার

2
@ কিরক.বার্লসন যা দেখতে পৃথক প্রশ্নের মতো।
কম্পিশিপ

আপনাকে MyNullableDate=date; এটি সেট করতে হবে, এটি MyDate = MyNullableDate.Value;থেকে পড়তে হবে এবং if(MyNullableDate.HasValue)এটি শূন্য রয়েছে কিনা তা পরীক্ষা করতে হবে
11:56 এ সত্যাবেল

উত্তরের "শেষ অবধি" কিছুটা স্পষ্ট করতে - নুলাবাল <ডেটটাইম> (ডেটটাইম?) এর ডিফল্টটি নাল, কারণ নুলাবাল <T> একটি রেফারেন্স টাইপ তৈরি করে।
ryanwebjackson

88

আপনি যদি নেট .০.০ (বা তারপরে) ব্যবহার করছেন তবে আপনি nallable টাইপটি ব্যবহার করতে পারেন:

DateTime? dt = null;

অথবা

Nullable<DateTime> dt = null;

তাহলে পরে:

dt = new DateTime();

এবং আপনি এর সাথে মানটি পরীক্ষা করতে পারেন:

if (dt.HasValue)
{
  // Do something with dt.Value
}

অথবা আপনি এটি ব্যবহার করতে পারেন:

DateTime dt2 = dt ?? DateTime.MinValue;

আপনি এখানে আরও পড়তে পারেন:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx


1
আপনি নেট .NET এর পূর্ববর্তী সংস্করণগুলিতেও nallable প্রকারগুলি ব্যবহার করতে পারেন, 3.0 এর প্রয়োজন নেই।
স্টেফেনবায়ার

1
এটা .NET 2.0 এসেছিল? দ্য ? 3.5 বাক্যে সিন্ট্যাক্সটি ভিবি.এনইটি-তে যুক্ত করা হয়েছিল, তবে আমি বিশ্বাস করি যে এটি 2.0 থেকে সি # তে রয়েছে।
ডেভিড মহুন্দরো

1
নালযোগ্য প্রকারগুলি। নেট 2.0 এ উপলব্ধ। সি # শর্টহ্যান্ড হয়েছে? 2.0 থেকে স্বরলিপি। কেবল ভিবি.নেটের শর্টহ্যান্ড ছিল না? ২.০ তে তবে আপনি ব্যবহারযোগ্য নুলাবল (
তারিখের সময়

শেষ স্নিপেটের জন্য, আমি ডেটটাইম dt2 = dt বলব ?? DateTime.MinValue;
জোয়েল কোহর্ন

আমি ব্যবহার করব dt.GetValueOrDefault()- এটি সবচেয়ে দক্ষ বিকল্প।
কম্পিশিপ

37

তারিখ সময়? MyDateTime {পান; সেট;}

MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);

1
এটি আমাকে পাসিং ঠিক nullকাজ করে না তা আবিষ্কার করতে সহায়তা করে। এটা করা দরকার (DateTime?)null
ইনফিনিট ফ্র্যাক্টাল

33

নিম্নলিখিত উপায় পাশাপাশি কাজ করে

myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;

দয়া করে মনে রাখবেন যে সম্পত্তি প্রকাশের তারিখটি ডেটটাইম হওয়া উচিত?



8

এটি উল্লেখ করার মতো যে, যখন DateTimeচলকটি নাও হতে nullপারে তবুও nullএটি সংকলক ত্রুটি ছাড়া তুলনা করা যেতে পারে :

DateTime date;
...
if(date == null) // <-- will never be 'true'
  ...

6

আপনি একটি অযোগ্য ক্লাস ব্যবহার করতে পারেন।

DateTime? date = new DateTime?();

এটি সম্ভবত লক্ষণীয় যে এটি আপনাকে অ-অযোগ্যকে তাত্ক্ষণিক করার চেয়ে আলাদা আচরণ দেবে DateTime। পূর্বে উল্লিখিত হিসাবে, new DateTime()কার্যকরভাবে আপনাকে দেবে DateTime.Minযেখানে ফলশূন্য new DateTime?()হবে।
ভিটোক

6

আপনি এটির জন্য একটি অযোগ্য ডেটটাইম ব্যবহার করতে পারেন।

Nullable<DateTime> myDateTime;

বা একই জিনিস যেমন লেখা:

DateTime? myDateTime;

6

আপনি ডেটটাইম সেট করতে পারবেন নলেলেবলের। ডিফল্টরূপে ডেটটাইম আটকানো যায় না। আপনি এটি কয়েকটি উপায়ে অবিচ্ছিন্ন করতে পারেন। ডেটটাইম টাইপের পরে একটি প্রশ্ন চিহ্ন ব্যবহার করছেন? মাইটাইম বা জেনেরিক স্টাইলটি নুলাবল ব্যবহার করে।

DateTime? nullDate = null;

অথবা

DateTime? nullDate;

5

আমি সবসময় সময় সেট DateTime.MinValue। এইভাবে আমি কোনও নলআররএক্সসেপশন পাই না এবং আমি এটি এমন একটি তারিখের সাথে তুলনা করতে পারি যা আমার জানা নেই যে সেট করা নেই।


8
এর অর্থ আপনি "এখানে সত্যই আমার একটি ডেটটাইম প্রয়োজন" এবং "এটি alচ্ছিক" - ন্যারেবল <ডেটটাইম> একটি আরও ভাল সমাধান, আইএমও এর মধ্যে পার্থক্য বলতে পারবেন না।
জন স্কিটি

? আমি সত্যিই আপনার মন্তব্য পাই না। হ্যাঁ আমি জানি যখন ডেটটাইমটি এতদূর বাস্তবের এভয়েসগুলির মতো হয় যদি তা শূন্য হয় ...
প্যাট্রিক দেশজার্ডিনস

2
এটি সুবিধাজনক, তবে আমি ডেটটাইম.মিনভ্যালুকে একটি বিশেষ কেস শর্ত নয়, মান হিসাবে দেখি। এটি কেবলমাত্র লাইনে সমস্যা তৈরি করতে পারে। আমি নলেবল <ডেটটাইম> সাথে যাব।
স্পোলসন

3
আমার মনে হয় আপনি আমার উত্তর সম্পর্কে কিছু মিস করেছেন, স্পোলসন কিছু লিখেছিলেন এবং আমি উত্তর দিচ্ছিলাম। জনসাধারণের সদস্যদের সম্পর্কে, ভাল এটি এক নয় এবং আপনি এটি জানেন। এটি স্ট্রিংয়ের মতো mpEmpty বা নাল। আপনি উভয়ই করতে পারেন, স্ট্রিংয়ের কারণে নয় mp এমপিটি আরও ভাল যে নালটি ভুল। যাই হোক.
প্যাট্রিক দেশজার্ডিনস

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

4

কেবল সতর্কতা অবলম্বন করুন - নল ব্যবহার করার সময় এর স্পষ্টতই কোনও 'খাঁটি' ডেটটাইম অবজেক্ট থাকবে না, যেমন আপনি ডেটটাইম সদস্যদের সরাসরি অ্যাক্সেস করতে পারবেন না। আমি চেষ্টা করে ব্যাখ্যা করব।

নুলযোগ্য <> ব্যবহার করে আপনি মূলত ডেটটাইমটি একটি ধারক (যাঁকে ধন্যবাদ জেনার্সে) মুড়ে রাখছেন যার মধ্যে অযোগ্য - সম্ভবত এটির উদ্দেশ্য। এই ধারকটির নিজস্ব বৈশিষ্ট্য রয়েছে যা আপনি কল করতে পারেন যা পূর্বোক্ত তারিখের সময় অবজেক্টটিতে অ্যাক্সেস সরবরাহ করবে; সঠিক সম্পত্তি ব্যবহারের পরে - এক্ষেত্রে নলাবল.ভ্যালু - আপনার পরে স্ট্যান্ডার্ড ডেটটাইম সদস্য, বৈশিষ্ট্য ইত্যাদির অ্যাক্সেস রয়েছে

সুতরাং - এখন ডেটটাইম অবজেক্টটি অ্যাক্সেস করার সর্বোত্তম উপায় হিসাবে বিষয়টি মাথায় আসে। কয়েকটি উপায় আছে, 1 নম্বরটি এফএআর দ্বারা সর্বোত্তম এবং 2 "বোন কেন"।

  1. নুলযোগ্য.মূল্য সম্পত্তি ব্যবহার করে,

    DateTime date = myNullableObject.Value.ToUniversalTime(); //Works

    DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails

  2. রূপান্তরকারী টুডেটটাইম () ব্যবহার করে ডাবলটাইমকে ডেটটাইমে রূপান্তর করা,

    DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...

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

সম্পাদনা: তৃতীয় বিকল্পটি সরানো হয়েছে কারণ এটি কিছুটা অত্যধিক নির্দিষ্ট এবং কেস নির্ভর।


2

যদিও প্রত্যেকে আপনাকে ইতিমধ্যে উত্তরটি দিয়ে গেছে, আমি একটি উপায় উল্লেখ করব যা কোনও ফাংশনে ডেটটাইম পাস করা সহজ করে

[ত্রুটি: সিস্টেম.ডেটটাইম রূপান্তর করতে পারে না? to system.datetime]

DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);

এখন আপনি কোনও সমস্যা ছাড়াই ফাংশনটির ভিতরে ডিটি পাস করতে পারেন।


1

আপনি যদি কখনও কখনও নালার প্রত্যাশা করেন তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)

আপনার ভাণ্ডারে নাল-সক্ষম ডেটটাইম ব্যবহার করুন।

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}

1

আমার একই সমস্যা ছিল নিক্ষেপকারীদের নিক্ষেপ করার জন্য ইউনিট পরীক্ষা করার সময় ডেটটাইমের জন্য প্যারামিটার হিসাবে দিতে হয়েছিল, যেমনটি নিম্নলিখিত বিকল্পটি ব্যবহার করে আমার ক্ষেত্রে কাজ করেছে:

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));

0

একটি তারিখ / সময় ডেটা টাইপের প্রকৃতির কারণে এটিতে কোনও nullমান থাকতে পারে না , অর্থাত এটির একটি মান থাকা দরকার, এটি খালি হতে পারে না বা কিছুই থাকতে পারে না। যদি আপনি কোনও তারিখ / সময় পরিবর্তনশীল হিসাবে চিহ্নিত করেন nullableতবে কেবলমাত্র আপনি এটিতে একটি নাল মান নির্ধারণ করতে পারেন। সুতরাং আপনি যা করতে যাচ্ছেন তা দুটি জিনিসের মধ্যে একটি (আরও কিছু থাকতে পারে তবে আমি কেবল দুটি বিষয়েই ভাবতে পারি):

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

  • আপনার তারিখ / সময় পরিবর্তনশীল হিসাবে চিহ্নিত করুন nullable। আপনি nullযদি তার সাথে কোনও ভেরিয়েবল না রাখেন তবে আপনি আপনার তারিখ / সময় পরিবর্তনশীল সেট করতে পারেন।

আমার উদাহরণটি ব্যবহার করে আমার প্রথম পয়েন্টটি প্রদর্শন করুন। DateTimeপরিবর্তনশীল টাইপ নাল সেট করা যাবে না, এটা এই ক্ষেত্রে, একটি মান প্রয়োজন আমি এটি সেট করতে যাচ্ছি DateTimeযদি কোনো মান এর সর্বনিম্ন মান।

আমার দৃশ্যটি আমার BlogPostক্লাস আছে have এটির অনেকগুলি পৃথক ক্ষেত্র / বৈশিষ্ট্য রয়েছে তবে আমি উদাহরণ হিসাবে কেবল দুটি ব্যবহার করতে পছন্দ করেছি। DatePublishedপোস্টটি যখন ওয়েবসাইটে প্রকাশিত হয়েছিল এবং একটি তারিখ / সময় মান থাকতে হয়। DateModifiedযখন কোনও পোস্ট সংশোধন করা হয়, সুতরাং এতে কোনও মান থাকতে হবে না, তবে মান থাকতে পারে।

public class BlogPost : Entity
{
     public DateTime DateModified { get; set; }

     public DateTime DatePublished { get; set; }
}

ADO.NETডাটাবেস থেকে ডেটা পেতে ব্যবহার করে (নির্ধারণের DateTime.MinValueকোনও মূল্য নেই):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

DateModifiedক্ষেত্রটি হিসাবে চিহ্নিত করে আপনি আমার দ্বিতীয় বিষয়টি সম্পাদন করতে পারেন nullable। এখন আপনি এটি সেট করতে পারেন nullযদি এর কোনও মূল্য না থাকে:

public DateTime? DateModified { get; set; }

ADO.NETডাটাবেস থেকে ডেটা পেতে ব্যবহার করে, এটি উপরে যেভাবে করা হয়েছিল তার চেয়ে কিছুটা ভিন্ন দেখাচ্ছে ( nullপরিবর্তে বরাদ্দ দেওয়া DateTime.MinValue):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

আমি আশা করি এটি কোনও বিভ্রান্তি দূর করতে সহায়তা করে। প্রদত্ত যে আমার প্রতিক্রিয়া প্রায় 8 বছর পরে আপনি সম্ভবত একজন বিশেষজ্ঞ সি # প্রোগ্রামার হবেন :)

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