আমি ভাবছিলাম যে দুটি সম্পত্তি কীভাবে কাজ করে তার নীতিগুলি ঠিক কী। আমি জানি দ্বিতীয়টি সর্বজনীন এবং মূলত সময় অঞ্চলগুলি নিয়ে কাজ করে না, তবে কেউ কীভাবে তারা কাজ করে এবং কোনটি কোন দৃশ্যে ব্যবহার করা উচিত তা বিশদ দিয়ে ব্যাখ্যা করতে পারে?
আমি ভাবছিলাম যে দুটি সম্পত্তি কীভাবে কাজ করে তার নীতিগুলি ঠিক কী। আমি জানি দ্বিতীয়টি সর্বজনীন এবং মূলত সময় অঞ্চলগুলি নিয়ে কাজ করে না, তবে কেউ কীভাবে তারা কাজ করে এবং কোনটি কোন দৃশ্যে ব্যবহার করা উচিত তা বিশদ দিয়ে ব্যাখ্যা করতে পারে?
উত্তর:
ডেটটাইম.ইউটিসি এখন আপনাকে তারিখ ও সময় জানায় যেহেতু এটি সমন্বিত ইউনিভার্সাল সময় হিসাবে হবে, যাকে গ্রিনিচ মিন টাইম টাইম অঞ্চলও বলা হয় - মূলত এটির মতো যদি আপনি লন্ডন ইংল্যান্ডে থাকতেন তবে গ্রীষ্মের সময় না। ডেটটাইম.এখন তারিখ এবং সময় দেয় কারণ এটি আপনার বর্তমান লোকেলের কারও কাছে প্রদর্শিত হবে।
আমি DateTime.Now
যখনই কোনও মানুষের সাথে কোনও তারিখ প্রদর্শন করছি তখন ব্যবহার করার পরামর্শ দেব - তারা যে মূল্য দেখায় তাতে তারা স্বাচ্ছন্দ্য বোধ করে - এটি এমন কিছু যা তারা সহজেই তাদের ঘড়ি বা ঘড়িতে যা দেখে তার সাথে তুলনা করতে পারে। ব্যবহারের DateTime.UtcNow
যখন আপনি (একটি ক্লায়েন্ট-সার্ভার মডেল) তারিখ সঞ্চয় করতে বা যে ভাবে পরে সেগুলি গণনার জন্য ব্যবহার আপনার গণনার আপনার সার্ভার থেকে বা একে অপরের থেকে বিভিন্ন টাইম জোনের মধ্যে ক্লায়েন্টদের দ্বারা বিভ্রান্ত হয়ে চাই না।
এটি সত্যিই বেশ সহজ, তাই আমি মনে করি এটি আপনার শ্রোতা কী এবং তারা কোথায় থাকে তা নির্ভর করে।
আপনি যদি ইউটিসি ব্যবহার না করেন, আপনি অবশ্যই তার তারিখ এবং সময় প্রদর্শন করছেন এমন ব্যক্তির টাইমজোনটি অবশ্যই জানতে হবে - অন্যথায় আপনি তাদের বলবেন যে সিস্টেম বা সার্ভারের সময় 3 টা বাজে ঘটেছে, যখন এটি সত্যি 5 টা বাজে ঘটেছে তারা বাঁচতে ঘটে।
আমরা ব্যবহার করি DateTime.UtcNow
কারণ আমাদের কাছে বিশ্বব্যাপী ওয়েব শ্রোতা রয়েছে এবং কারণ আমি প্রতিটি ব্যবহারকারীকে কী টাইমজোন বাস করে তা বোঝায় এমন একটি ফর্ম পূরণ করতে নাড়তে পছন্দ করব।
আমরা আপেক্ষিক সময়গুলি (2 ঘন্টা আগে, 1 দিন আগে, ইত্যাদি) পোস্টের বয়সের পর্যায়ে যথেষ্ট সময় পর্যন্ত প্রদর্শন করি যে পৃথিবীতে আপনি কোথায় থাকুন না কেন সময় "একই" is
কর্মক্ষমতা পার্থক্য নোট করুন; DateTime.UtcNow
তখন কোথাও প্রায় 30 গুণ বেশি গতিযুক্ত DateTime.Now
, কারণ অভ্যন্তরীণভাবে DateTime.Now
অনেক সময় অঞ্চল সমন্বয় করা হচ্ছে (আপনি সহজেই এটি প্রতিফলকের সাথে যাচাই করতে পারেন)।
সুতরাং DateTime.Now
আপেক্ষিক সময় পরিমাপের জন্য ব্যবহার করবেন না ।
.NET বুঝতে এক প্রধান ধারণা যে এখন হয় এখন । সমস্ত পৃথিবীর উপরে কোন ব্যাপার যদি আপনার সাথে একটি পরিবর্তনশীল লোড কি সময় জোন আপনি এখন আছেন DateTime.Now
বা DateTime.UtcNow
-। নিয়োগ অভিন্ন * আপনার DateTime
বস্তুর জানেন টাইমজোন যেখানে আপনি থাকেন এবং নির্ধারিত নির্বিশেষে এটিকে বিবেচনায় নেয়।
DateTime.UtcNow
দিবালোক সঞ্চয় সময় সীমানা জুড়ে তারিখ গণনা করার সময় এর কার্যকারিতা কার্যকর হয় । এটি হ'ল যে জায়গাগুলিতে দিবালোকের সঞ্চয়ের সময় অংশ নেয়, কখনও কখনও পরের দিন দুপুর থেকে দুপুর থেকে 25 ঘন্টা অবধি থাকে এবং কখনও কখনও পরের দিন দুপুর থেকে দুপুরের মধ্যে ২৩ ঘন্টা থাকে। আপনি যদি সময় A এবং সময় বি থেকে ঘন্টা সঠিকভাবে নির্ধারণ করতে চান তবে আপনার প্রথমে প্রতিটি গণনা করার আগে তাদের ইউটিসি সমতুল্যে অনুবাদ করতে হবে TimeSpan
।
এটি এমন একটি ব্লগ পোস্ট দ্বারা আচ্ছাদিত যা আমি লিখেছিলাম যা আরও ব্যাখ্যা করে TimeSpan
এবং এতে আরও বিস্তৃত এমএস নিবন্ধের লিঙ্ক অন্তর্ভুক্ত রয়েছে।
* স্পষ্টকরণ: হয় নির্ধারিত সময় বর্তমান সময় সংরক্ষণ করবে। আপনি মাধ্যমে দুটি ভেরিয়েবল এক লোড করতে হলে DateTime.Now()
এবং এর মাধ্যমে অন্যান্য দুই এর মধ্যে পার্থক্য মিলিসেকেন্ড, না ঘন্টা অভিমানী আপনি একটি সময় অঞ্চল জিএমটি থেকে ঘন্টা দূরে রয়েছে হবে। নীচে উল্লিখিত হিসাবে, তাদের মান মুদ্রণ বিভিন্ন স্ট্রিং প্রদর্শিত হবে।DateTime.UtcNow()
TimeSpan
String
এটা একটা ভালো প্রশ্ন। কীভাবে। নেট বিভিন্ন Kind
মান সহকারে আচরণ করে সে সম্পর্কে আরও কিছুটা বিশদ দেওয়ার জন্য আমি এটি পুনর্জীবিত করছি । @Jan Zich দেখায় যে এটা আসলে একটি সমালোচকদের গুরুত্বপূর্ণ সম্পত্তি এবং আপনি ব্যবহার কিনা তার উপর নির্ভর করে ভিন্নভাবে সেট করা হয় Now
বা UtcNow
।
অভ্যন্তরীণভাবে তারিখ সংরক্ষিত হয় Ticks
যা (@Carl ক্যামেরার উত্তর বিপরীত) যদি আপনি ব্যবহার উপর নির্ভর করে ভিন্ন Now
বা UtcNow
।
DateTime.UtcNow
অন্যান্য ভাষার মতো আচরণ করে। এটি Ticks
একটি GMT ভিত্তিক মান সেট করে। এটিও সেট Kind
করে Utc
।
DateTime.Now
GMT টাইম জোনে আপনার দিনের সময় হলে এটির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
যা একই নয়।
প্রশ্নের সরাসরি উত্তর আমার প্রত্যেকে কখন ব্যবহার করতে হবে সে সম্পর্কে গৃহীত উত্তরের পরামর্শের সাথে একমত হয়। আই / ও (প্রদর্শন এবং পার্সিং) ব্যতীত আপনার সর্বদা অবজেক্টের সাথে কাজ করার চেষ্টা করা উচিত । এর অর্থ হল আপনি প্রায়শই সর্বদা ব্যবহার করা উচিত , আপনি কেবলমাত্র প্রদর্শন করার জন্য অবজেক্টটি তৈরি করছেন এবং তা এখনই তা বাতিল করুন discardDateTime
Kind=Utc
DateTime.UtcNow
ডেটটাইম কোন অঞ্চল অঞ্চল কোন ধারণা নেই। এটি সর্বদা ধরে নেয় আপনি আপনার স্থানীয় সময়ে আছেন। উতকনোর অর্থ কেবল "সময় থেকে আমার টাইমজোনটি বিয়োগ করুন"।
আপনি যদি সময় অঞ্চল-সচেতন তারিখগুলি ব্যবহার করতে চান তবে ডেটটাইম অফসেট ব্যবহার করুন , যা একটি সময় / অঞ্চল সহ একটি তারিখ / সময় উপস্থাপন করে। আমি যে হার্ড উপায় শিখতে হয়েছিল।
প্রশ্নের "সহজ" উত্তরটি হ'ল:
ডেটটাইম.এখন বর্তমান, সিস্টেম সময়কে উপস্থাপন করে একটি টাইমটাইম মান প্রদান করে (সিস্টেমটি যে টাইম জোনে চলেছে)। DateTime.Kind সম্পত্তি হতে হবে DateTimeKind.Local
ডেটটাইম.ইউটিসি এখনকার ইউনিভার্সাল কো-অর্ডিনেটেড টাইম (ওরফে ইউটিসি) উপস্থাপন করে একটি ডেটটাইম মান প্রদান করে যা সিস্টেমের সময় অঞ্চল নির্বিশেষে একই হবে। DateTime.Kind সম্পত্তি হতে হবে DateTimeKind.Utc
উপরোক্ত পয়েন্টগুলিতে কিছুটা সংযোজন: ডেটটাইম স্ট্রাক্টে কিন্ড নামক একটি সামান্য পরিচিত ক্ষেত্র রয়েছে (কমপক্ষে, আমি দীর্ঘকাল এটি সম্পর্কে জানতাম না)। এটি মূলত একটি পতাকা যা নির্দেশ করে যে সময়টি স্থানীয় বা ইউটিসি; এটি স্থানীয় সময়ের জন্য ইউটিসি থেকে আসল অফসেট নির্দিষ্ট করে না। এই স্ট্যাকটি কী কী উদ্দেশ্যগুলি নির্ধারণ করা হয়েছিল তার সাথে ইঙ্গিত করে তা ছাড়াও, এটি ToUniversalTime () এবং ToLocalTime () পদ্ধতিগুলি কীভাবে কাজ করে তাও প্রভাবিত করে ।
পার্টিতে কিছুটা দেরি হলেও আমি এই দুটি লিঙ্ক (4guysfromrolla) খুব দরকারী বলে খুঁজে পেয়েছি:
তারিখ / সময়ের মান সংরক্ষণ করতে সমন্বিত ইউনিভার্সাল সময় (ইউটিসি) ব্যবহার করা
বিভিন্ন সময় অঞ্চল জুড়ে তারিখ এবং টাইমস সংরক্ষণ এবং প্রদর্শনের জন্য পরামর্শ
ডেটটাইম.ইউটিসি এখন একটি অবিচ্ছিন্ন, একক-মূল্যবান সময় স্কেল, যেখানে ডেটটাইম.নিউ ক্রমাগত বা একক-মূল্যবান নয়। প্রাথমিক কারণ হ'ল দিবালোক সঞ্চয় সময়, যা ইউটিসির ক্ষেত্রে প্রযোজ্য নয়। সুতরাং ইউটিসি কখনই এক ঘন্টা এগিয়ে বা পিছনে ঝাঁপ দেয় না, যেখানে স্থানীয় সময় (ডেটটাইম.নিউ) করে। এবং যখন এটি পিছনে লাফ দেয়, একই সময়ের মানটি দু'বার হয়।
ডেটটাইম.উটকনো একটি ইউনিভার্সাল টাইম স্কেল যা দিবালোক সঞ্চয় সময় বাদ দেয়। সুতরাং ইউটিসি কখনই ডিএসটি-র কারণে পরিবর্তন হয় না।
তবে, ডেটটাইম.এখন অবিচ্ছিন্ন বা একক-মূল্যবান নয় কারণ এটি ডিএসটি অনুসারে পরিবর্তিত হয়। ডেটটাইম.এর অর্থ এখন, একই সময়ের মানটি গ্রাহকদের বিভ্রান্ত অবস্থায় রেখে দু'বার ঘটতে পারে।
আপনার অ্যাপ্লিকেশনটি (ইউরোপের সিইএসটি-র মতো) চালিত মেশিনটির জন্য যখন আপনার স্থানীয় সময় প্রয়োজন তখন, এখনই ব্যবহার করুন। আপনি যদি সার্বজনীন সময় চান - উতকনো। এটি কেবল আপনার পছন্দগুলির বিষয় - সম্ভবত কোনও স্থানীয় ওয়েবসাইট / স্বতন্ত্র অ্যাপ্লিকেশন তৈরি করা যা আপনি ব্যবহারকারীর সময় ব্যবহার করতে চান - তাই তার / তার টাইমজোন সেটিং দ্বারা প্রভাবিত - ডেটটাইম N এখন।
কেবল মনে রাখবেন, কোনও ওয়েবসাইটের জন্য এটি সার্ভারের টাইমজোন সেটিংস। সুতরাং আপনি যদি ব্যবহারকারীর জন্য সময় প্রদর্শন করে থাকেন তবে হয় তার পছন্দসই টাইমজোন পান এবং সময় স্থানান্তর করুন (কেবল তখন ইউটিসি সময়টিকে ডাটাবেসে সংরক্ষণ করুন, এবং এটি পরিবর্তন করুন) বা এটি ইউটিসি নির্দিষ্ট করে দিন। আপনি যদি এটি করতে ভুলে যান তবে ব্যবহারকারী এর মতো কিছু দেখতে পারে: 3 মিনিট আগে পোস্ট করা হয়েছিল এবং তারপরে ভবিষ্যতে একটি সময় :)
বড় পার্থক্য :) হ'ল ডেটটাইম.এখন শেয়ারপয়েন্ট ওয়ার্কফ্লোতে সমর্থিত নয় আপনাকে অবশ্যই ডেটটাইম ব্যবহার করতে হবে .আপনি এখন