ডেটটাইম.নাও বনাম তারিখটাইম.উত্তাকনো


225

আমি ভাবছিলাম যে দুটি সম্পত্তি কীভাবে কাজ করে তার নীতিগুলি ঠিক কী। আমি জানি দ্বিতীয়টি সর্বজনীন এবং মূলত সময় অঞ্চলগুলি নিয়ে কাজ করে না, তবে কেউ কীভাবে তারা কাজ করে এবং কোনটি কোন দৃশ্যে ব্যবহার করা উচিত তা বিশদ দিয়ে ব্যাখ্যা করতে পারে?


1
খুব দেরিতে হতে পারে তবে আমি এই ব্লগে ইঙ্গিত করতে চাই: blog.angeloflogic.com/2013/10/…
কাই ওয়াং

ছোট বেঞ্চ-চিহ্নিতকারী rextester.com/QRDR82396
ড্যানিয়েল বি

উত্তর:


346

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

আমি DateTime.Nowযখনই কোনও মানুষের সাথে কোনও তারিখ প্রদর্শন করছি তখন ব্যবহার করার পরামর্শ দেব - তারা যে মূল্য দেখায় তাতে তারা স্বাচ্ছন্দ্য বোধ করে - এটি এমন কিছু যা তারা সহজেই তাদের ঘড়ি বা ঘড়িতে যা দেখে তার সাথে তুলনা করতে পারে। ব্যবহারের DateTime.UtcNowযখন আপনি (একটি ক্লায়েন্ট-সার্ভার মডেল) তারিখ সঞ্চয় করতে বা যে ভাবে পরে সেগুলি গণনার জন্য ব্যবহার আপনার গণনার আপনার সার্ভার থেকে বা একে অপরের থেকে বিভিন্ন টাইম জোনের মধ্যে ক্লায়েন্টদের দ্বারা বিভ্রান্ত হয়ে চাই না।


84
একটি দুর্দান্ত পয়েন্ট - কোনও ডাটাবেস বা ফাইলে তারিখগুলি সংরক্ষণ করার সময় অবশ্যই এটি ইউটিসিতে সংরক্ষণ করুন!
জেফ আতউড

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

@ ওমরওয়ানক্লোটেন একটি খুব ভাল পয়েন্ট দেয়। আমি ভাবছি যে এটির জন্য কোনও মার্জিত 'অল রাউন্ড' সমাধান রয়েছে, প্রতিবারের মতো তারিখগুলি সঠিকভাবে সঞ্চয় এবং পুনরুদ্ধার করার জন্য, যদি আপনার আইআইএস এবং এসকিউএল সার্ভারটি বিভিন্ন টাইমজোনগুলিতে থাকে।
TheGeekZn

1
@ জোশায়টেস ১৯৮০ হ্যাঁ আপনি কেবল তারিখটাইম করুন।অটাকনো.এড অ্যাডসস (১)
ক্যাথাল এমএফ

3
নোডটাইম ব্যবহার করুন - এটি আপনাকে আরও কার্যকর উপায়ে সময় সম্পর্কে ভাবতে বাধ্য করবে এবং এই জাতীয় সমস্যাগুলি এড়াতে সক্ষম হবে
aateeque

86

এটি সত্যিই বেশ সহজ, তাই আমি মনে করি এটি আপনার শ্রোতা কী এবং তারা কোথায় থাকে তা নির্ভর করে।

আপনি যদি ইউটিসি ব্যবহার না করেন, আপনি অবশ্যই তার তারিখ এবং সময় প্রদর্শন করছেন এমন ব্যক্তির টাইমজোনটি অবশ্যই জানতে হবে - অন্যথায় আপনি তাদের বলবেন যে সিস্টেম বা সার্ভারের সময় 3 টা বাজে ঘটেছে, যখন এটি সত্যি 5 টা বাজে ঘটেছে তারা বাঁচতে ঘটে।

আমরা ব্যবহার করি DateTime.UtcNowকারণ আমাদের কাছে বিশ্বব্যাপী ওয়েব শ্রোতা রয়েছে এবং কারণ আমি প্রতিটি ব্যবহারকারীকে কী টাইমজোন বাস করে তা বোঝায় এমন একটি ফর্ম পূরণ করতে নাড়তে পছন্দ করব।

আমরা আপেক্ষিক সময়গুলি (2 ঘন্টা আগে, 1 দিন আগে, ইত্যাদি) পোস্টের বয়সের পর্যায়ে যথেষ্ট সময় পর্যন্ত প্রদর্শন করি যে পৃথিবীতে আপনি কোথায় থাকুন না কেন সময় "একই" is


আমি দ্বিতীয়টিও চাই যে ডেটটাইম স্টোর করা উচিত tএইচটিএনও কেবল তখনই প্রয়োজন যখন 2 ঘন্টা তারিখ সহ গণনা সঠিক সময় পাওয়ার জন্য করা হয়। যখন আমাকে কেবল একটি নিবন্ধভুক্ত তারিখ প্রদর্শন করতে হবে তখন ডেটটাইম.এখন যথেষ্ট।
এলিজাবেথ

36

কর্মক্ষমতা পার্থক্য নোট করুন; DateTime.UtcNowতখন কোথাও প্রায় 30 গুণ বেশি গতিযুক্ত DateTime.Now, কারণ অভ্যন্তরীণভাবে DateTime.Nowঅনেক সময় অঞ্চল সমন্বয় করা হচ্ছে (আপনি সহজেই এটি প্রতিফলকের সাথে যাচাই করতে পারেন)।

সুতরাং DateTime.Nowআপেক্ষিক সময় পরিমাপের জন্য ব্যবহার করবেন না ।


এটা আমার রয়েছে যন্ত্রণাদায়ক যাত্রা নিয়েছে শুধু জানতে UtcNow ভাল পারফরম্যান্স এবং যে কেবল UtcNow তারিখ নির্ভরশীল প্রদর্শন মাইএসকিউএল আপনার তারিখগুলি সংরক্ষণ করা এবং অভিমানী যে UTC এবং তুলনা এই বিশ্বব্যাপী সময় অঞ্চল সমস্যা সরলীকৃত
Diin

29

.NET বুঝতে এক প্রধান ধারণা যে এখন হয় এখন । সমস্ত পৃথিবীর উপরে কোন ব্যাপার যদি আপনার সাথে একটি পরিবর্তনশীল লোড কি সময় জোন আপনি এখন আছেন DateTime.Nowবা DateTime.UtcNow-। নিয়োগ অভিন্ন * আপনার DateTimeবস্তুর জানেন টাইমজোন যেখানে আপনি থাকেন এবং নির্ধারিত নির্বিশেষে এটিকে বিবেচনায় নেয়।

DateTime.UtcNowদিবালোক সঞ্চয় সময় সীমানা জুড়ে তারিখ গণনা করার সময় এর কার্যকারিতা কার্যকর হয় । এটি হ'ল যে জায়গাগুলিতে দিবালোকের সঞ্চয়ের সময় অংশ নেয়, কখনও কখনও পরের দিন দুপুর থেকে দুপুর থেকে 25 ঘন্টা অবধি থাকে এবং কখনও কখনও পরের দিন দুপুর থেকে দুপুরের মধ্যে ২৩ ঘন্টা থাকে। আপনি যদি সময় A এবং সময় বি থেকে ঘন্টা সঠিকভাবে নির্ধারণ করতে চান তবে আপনার প্রথমে প্রতিটি গণনা করার আগে তাদের ইউটিসি সমতুল্যে অনুবাদ করতে হবে TimeSpan

এটি এমন একটি ব্লগ পোস্ট দ্বারা আচ্ছাদিত যা আমি লিখেছিলাম যা আরও ব্যাখ্যা করে TimeSpanএবং এতে আরও বিস্তৃত এমএস নিবন্ধের লিঙ্ক অন্তর্ভুক্ত রয়েছে।

* স্পষ্টকরণ: হয় নির্ধারিত সময় বর্তমান সময় সংরক্ষণ করবে। আপনি মাধ্যমে দুটি ভেরিয়েবল এক লোড করতে হলে DateTime.Now()এবং এর মাধ্যমে অন্যান্য দুই এর মধ্যে পার্থক্য মিলিসেকেন্ড, না ঘন্টা অভিমানী আপনি একটি সময় অঞ্চল জিএমটি থেকে ঘন্টা দূরে রয়েছে হবে। নীচে উল্লিখিত হিসাবে, তাদের মান মুদ্রণ বিভিন্ন স্ট্রিং প্রদর্শিত হবে।DateTime.UtcNow()TimeSpanString


1
"ডেটটাইম.এইউ বা ডেটটাইম.এইচটিউ-র সাথে একটি ভেরিয়েবল লোড করুন" সম্পর্কিত ক্ষেত্রে অ্যাসাইনমেন্টটি অভিন্ন ": এটি পরিষ্কার করার প্রয়োজন হতে পারে? আমি এখানে ইডিটি টাইমজোন (ইউটিসি -4) এ বসে, আমি যথাক্রমে ডেটটাইম.উত্তকনো এবং ডেটটাইম.নুতে দুটি ভেরিয়েবল নির্ধারণ করেছি এবং তারপরে তাদের মানগুলি টোস্ট্রিং () দিয়ে মুদ্রিত করেছি। প্রদর্শিত মানগুলি 4 ঘন্টা আলাদা ছিল - "অভিন্ন" নয়।
জন স্নাইডার

2
@ জনস্কিনিডার, আমি বিশ্বাস করি আপনি সঠিক আছেন। উক্তিটি: "অ্যাসাইনমেন্টটি অভিন্ন" সত্য নয়। টুস্ট্রিং () সম্ভবত এটি পরীক্ষা করার সেরা উপায় নয়, কারণ এটি সমান তারিখগুলি আলাদাভাবে প্রদর্শন করতে পারে (যেমন জাভাও করে)। তুলনা ফাংশন একটি ভাল পরীক্ষা, এবং তারা সত্যই সমান নয় প্রদর্শন।
টেড বিঘাম 20'15

আমার "অভিন্ন" বিবৃতিতে স্পষ্টতা: ডেটটাইম.নউ এর মাধ্যমে একটি ভেরিয়েবল লোড করুন এবং এখন অন্যটি ডেটটাইম.উত্তকনো দিয়ে এবং তারপরে টাইমস্প্যান পার্থক্য মুদ্রণ করুন। পার্থক্যটি মিলি সেকেন্ডের হবে এবং ঘন্টা না ধরে আপনি GMT থেকে কয়েক ঘন্টা দূরে রয়েছেন ing
কার্ল ক্যামেরা

18

এটা একটা ভালো প্রশ্ন। কীভাবে। নেট বিভিন্ন Kindমান সহকারে আচরণ করে সে সম্পর্কে আরও কিছুটা বিশদ দেওয়ার জন্য আমি এটি পুনর্জীবিত করছি । @Jan Zich দেখায় যে এটা আসলে একটি সমালোচকদের গুরুত্বপূর্ণ সম্পত্তি এবং আপনি ব্যবহার কিনা তার উপর নির্ভর করে ভিন্নভাবে সেট করা হয় Nowবা UtcNow

অভ্যন্তরীণভাবে তারিখ সংরক্ষিত হয় Ticksযা (@Carl ক্যামেরার উত্তর বিপরীত) যদি আপনি ব্যবহার উপর নির্ভর করে ভিন্ন Nowবা UtcNow

DateTime.UtcNowঅন্যান্য ভাষার মতো আচরণ করে। এটি Ticksএকটি GMT ভিত্তিক মান সেট করে। এটিও সেট Kindকরে Utc

DateTime.NowGMT টাইম জোনে আপনার দিনের সময় হলে এটিরTicks মানটি পরিবর্তিত হয় । এটিও সেট Kindকরে Local

যদি আপনি 6 ঘন্টা পিছনে থাকেন (GMT-6), আপনি 6 ঘন্টা আগে থেকে GMT সময় পাবেন। । নেট আসলে Kind"এখন" বলে মনে হওয়া সত্ত্বেও, এটিকে 6 ঘন্টা আগে যেমন মনে হচ্ছে তা উপেক্ষা ও আচরণ করে । এটি আরও বেশি বিরতি দেয় যদি আপনি কোনও DateTimeউদাহরণ তৈরি করেন তবে আপনার সময় অঞ্চলটি পরিবর্তন করুন এবং এটি ব্যবহারের চেষ্টা করুন।

বিভিন্ন 'ধরনের' মান সহ ডেটটাইম দৃষ্টান্তগুলি সামঞ্জস্যপূর্ণ নয়।

আসুন কিছু কোড দেখুন ...

    DateTime utc = DateTime.UtcNow;
    DateTime now = DateTime.Now;
    Debug.Log (utc + " " + utc.Kind);  // 05/20/2015 17:19:27 Utc
    Debug.Log (now + " " + now.Kind);  // 05/20/2015 10:19:27 Local

    Debug.Log (utc.Ticks);  // 635677391678617830
    Debug.Log (now.Ticks);  // 635677139678617840

    now = now.AddHours(1);
    TimeSpan diff = utc - now;
    Debug.Log (diff);  // 05:59:59.9999990

    Debug.Log (utc <  now);  // false
    Debug.Log (utc == now);  // false
    Debug.Log (utc >  now);  // true

    Debug.Log (utc.ToUniversalTime() <  now.ToUniversalTime());  // true
    Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() >  now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() -  now.ToUniversalTime());  // -01:00:00.0000010

আপনি এখানে দেখতে পাচ্ছেন, তুলনা এবং গণিত ফাংশনগুলি স্বয়ংক্রিয়ভাবে সামঞ্জস্যপূর্ণ সময়ে রূপান্তর করে না। Timespanপ্রায় এক ঘন্টা হওয়া উচিত ছিল, কিন্তু এর পরিবর্তে প্রায় 6. ছিল "UTC <এখন" সত্য হওয়া উচিত ছিল (আমি এমনকি নিশ্চিত হতে এক ঘণ্টা যোগ করা হয়েছে), কিন্তু এখনও মিথ্যা।

আপনি 'চারপাশের কাজ' দেখতে পাবেন যা সর্বজনীন সময়ে যে কোনও জায়গায় রূপান্তর করা Kindযা একই নয়।

প্রশ্নের সরাসরি উত্তর আমার প্রত্যেকে কখন ব্যবহার করতে হবে সে সম্পর্কে গৃহীত উত্তরের পরামর্শের সাথে একমত হয়। আই / ও (প্রদর্শন এবং পার্সিং) ব্যতীত আপনার সর্বদা অবজেক্টের সাথে কাজ করার চেষ্টা করা উচিত । এর অর্থ হল আপনি প্রায়শই সর্বদা ব্যবহার করা উচিত , আপনি কেবলমাত্র প্রদর্শন করার জন্য অবজেক্টটি তৈরি করছেন এবং তা এখনই তা বাতিল করুন discardDateTimeKind=UtcDateTime.UtcNow


7

ডেটটাইম কোন অঞ্চল অঞ্চল কোন ধারণা নেই। এটি সর্বদা ধরে নেয় আপনি আপনার স্থানীয় সময়ে আছেন। উতকনোর অর্থ কেবল "সময় থেকে আমার টাইমজোনটি বিয়োগ করুন"।

আপনি যদি সময় অঞ্চল-সচেতন তারিখগুলি ব্যবহার করতে চান তবে ডেটটাইম অফসেট ব্যবহার করুন , যা একটি সময় / অঞ্চল সহ একটি তারিখ / সময় উপস্থাপন করে। আমি যে হার্ড উপায় শিখতে হয়েছিল।


9
সম্পূর্ণরূপে সুনির্দিষ্ট হওয়ার জন্য (এবং পারফরম্যান্সের কারণে লোকদের উপর এখন নাটক ব্যবহার করা থেকে বিরত থাকতে), এটি অন্যান্য উপায়:
মাফু

5

প্রশ্নের "সহজ" উত্তরটি হ'ল:

ডেটটাইম.এখন বর্তমান, সিস্টেম সময়কে উপস্থাপন করে একটি টাইমটাইম মান প্রদান করে (সিস্টেমটি যে টাইম জোনে চলেছে)। DateTime.Kind সম্পত্তি হতে হবে DateTimeKind.Local

ডেটটাইম.ইউটিসি এখনকার ইউনিভার্সাল কো-অর্ডিনেটেড টাইম (ওরফে ইউটিসি) উপস্থাপন করে একটি ডেটটাইম মান প্রদান করে যা সিস্টেমের সময় অঞ্চল নির্বিশেষে একই হবে। DateTime.Kind সম্পত্তি হতে হবে DateTimeKind.Utc


4

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


3

1

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


1

ডেটটাইম.উটকনো একটি ইউনিভার্সাল টাইম স্কেল যা দিবালোক সঞ্চয় সময় বাদ দেয়। সুতরাং ইউটিসি কখনই ডিএসটি-র কারণে পরিবর্তন হয় না।

তবে, ডেটটাইম.এখন অবিচ্ছিন্ন বা একক-মূল্যবান নয় কারণ এটি ডিএসটি অনুসারে পরিবর্তিত হয়। ডেটটাইম.এর অর্থ এখন, একই সময়ের মানটি গ্রাহকদের বিভ্রান্ত অবস্থায় রেখে দু'বার ঘটতে পারে।


0

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

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


0

বড় পার্থক্য :) হ'ল ডেটটাইম.এখন শেয়ারপয়েন্ট ওয়ার্কফ্লোতে সমর্থিত নয় আপনাকে অবশ্যই ডেটটাইম ব্যবহার করতে হবে .আপনি এখন

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