ইউটিসি / জিএমটি সময়কে স্থানীয় সময় রূপান্তর করুন


301

আমরা একটি ওয়েব-পরিষেবা ক্লায়েন্টের জন্য একটি সি # অ্যাপ্লিকেশন বিকাশ করছি। এটি উইন্ডোজ এক্সপি পিসিতে চলবে।

ওয়েব সার্ভিসে ফিরে আসা ক্ষেত্রগুলির একটি হ'ল একটি ডেটটাইম ক্ষেত্র। সার্ভারটি GMT ফর্ম্যাটে একটি ক্ষেত্র ফেরায় অর্থাৎ শেষে "জেড" দিয়ে with

তবে, আমরা দেখতে পেয়েছি যে .NET মনে হয় যে এটি কোনওরকম অন্তর্নিহিত রূপান্তর করছে এবং সময়টি সর্বদা 12 ঘন্টা ছিল।

নিম্নলিখিত কোডের নমুনাটি কিছুটা ক্ষেত্রে সমাধান করে যে 12 ঘন্টাের পার্থক্য চলে গেছে তবে এটি এনজেড দিবালোক সংরক্ষণের জন্য কোনও ভাতা দেয় না।

CultureInfo ci = new CultureInfo("en-NZ");
string date = "Web service date".ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);            

অনুযায়ী এই তারিখ সাইটে :

ইউটিসি / জিএমটি অফসেট

স্ট্যান্ডার্ড সময় অঞ্চল: ইউটিসি / জিএমটি +12 ঘন্টা
দিবালোক সংরক্ষণের সময়: +1 ঘন্টা
বর্তমান সময় অঞ্চল অফসেট: ইউটিসি / জিএমটি +13 ঘন্টা

আমরা কীভাবে অতিরিক্ত ঘন্টা সামঞ্জস্য করব? এটি কি প্রোগ্রামগতভাবে করা যেতে পারে বা এটি পিসির কোনও ধরণের সেটিং?


2
Zসময় ইউটিসি না জিএমটি বোঝায়। দু'টি 0.9 সেকেন্ড পর্যন্ত পৃথক হতে পারে।
mc0e

উত্তর:


374

যেমন স্ট্রিংগুলির জন্য 2012-09-19 01:27:30.000, DateTime.Parseতারিখ এবং সময় কোন সময় অঞ্চল থেকে তা বলতে পারে না।

DateTimeএকটি দয়ালু সম্পত্তি রয়েছে, যার মধ্যে তিনটি টাইম জোন বিকল্প থাকতে পারে:

  • অসূচিত
  • স্থানীয়
  • ইউটিসি

দ্রষ্টব্য আপনি যদি ইউটিসি বা আপনার স্থানীয় সময় অঞ্চল ছাড়া অন্য কোনও তারিখ / সময় উপস্থাপন করতে চান তবে আপনার ব্যবহার করা উচিত DateTimeOffset


সুতরাং আপনার প্রশ্নের কোডের জন্য:

DateTime convertedDate = DateTime.Parse(dateStr);

var kind = convertedDate.Kind; // will equal DateTimeKind.Unspecified

আপনি বলেছেন আপনি জানেন যে এটি কী ধরণের, তাই এটি বলুন।

DateTime convertedDate = DateTime.SpecifyKind(
    DateTime.Parse(dateStr),
    DateTimeKind.Utc);

var kind = convertedDate.Kind; // will equal DateTimeKind.Utc

এখন, ইউটিসি সময়ে সিস্টেমটি একবারে জানার পরে আপনি কেবল কল করতে পারেন ToLocalTime:

DateTime dt = convertedDate.ToLocalTime();

এটি আপনাকে প্রয়োজনীয় ফলাফল দেবে।


19
DateTime convertedTime = new DateTime(DateTime.Parse(dateStr).Ticks), DateTimeKind.Utc);
ব্র্যাড

এটা কি ToLocalTime () নয়? @ ব্র্যাড - আপনার প্যারেনস মিলছে না।
ট্রুউইল

2
এই সমাধানটি কি দিবালোকের সঞ্চয়গুলির জন্য অ্যাকাউন্ট করে? আমি যখন এটি চেষ্টা করি, তখন আমি এক ঘন্টার বাইরে।
বব হর্ন

7
পরিবর্তনের পদক্ষেপ Kindএর DateTimeথেকে Unspecifiedথেকে UTCঅপ্রয়োজনীয়। এই উদ্দেশ্যে Unspecifiedগৃহীত হয় : এমএসডিএন.মাইক্রোসফটি.এইনUTCToLocalTime
ইউএস

16
@ সিজে 7: হ্যাঁ, তবে স্পষ্ট করে বলা অন্য বিকাশকারীদের পক্ষে বিশেষত সহায়ক যা কোড বজায় রাখতে পারে have
রায়ান

121

আপনি নেট নেট ৩.৫ এ থাকলে আমি সিস্টেম.টাইমজোনইনফো ক্লাসটি ব্যবহার করব। Http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx দেখুন । দিবালোকের সঞ্চয়ী পরিবর্তনগুলি সঠিকভাবে বিবেচনায় নেওয়া উচিত।

// Coordinated Universal Time string from 
// DateTime.Now.ToUniversalTime().ToString("u");
string date = "2009-02-25 16:13:00Z"; 
// Local .NET timeZone.
DateTime localDateTime = DateTime.Parse(date); 
DateTime utcDateTime = localDateTime.ToUniversalTime();

// ID from: 
// "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zone"
// See http://msdn.microsoft.com/en-us/library/system.timezoneinfo.id.aspx
string nzTimeZoneKey = "New Zealand Standard Time";
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey);
DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone);

আপনি যদি নিজের সময় অঞ্চলে (এন-এনজেড এই ক্ষেত্রে) কাজ করে থাকেন তবে আপনাকে টাইমজোনআইএনফো নিয়ে কাজ করার দরকার নেই। এটি কেবল অপ্রয়োজনীয় জটিলতা। আরও বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
ড্রয় নোকস

11
এবং কারও যদি প্রয়োজন হয় তবে টাইমজোনআইএনফো
ফাইন্ডসিসটেমটাইমজোনবিআইডি

উজ্জ্বল! ড্যান এই পোস্টের জন্য ধন্যবাদ। আমি এই ফিক্সটি 3 দিনের জন্য সন্ধান করছি।
কেভিন মুর

58
TimeZone.CurrentTimeZone.ToLocalTime(date);

8
এটি কেবল তখনই কাজ করে যদি সিস্টেম জানে যে রূপান্তরিত হওয়ার তারিখটি ইউটিসিতে রয়েছে। আমার উত্তর দেখুন দয়া করে।
ড্রয় নোকস

1
তবে ইউটিসি ডিফল্ট তাই না? সুতরাং এটি সিজে 7 এর উত্তরের মতো "অনির্ধারিত" হয়ে কাজ করে।
নিকজি

25

DateTimeবস্তু আছে Kindএর Unspecifiedডিফল্ট, যার উদ্দেশ্যে দ্বারা ToLocalTimeগণ্য করা হয় UTC

কোনও Unspecified DateTimeসামগ্রীর স্থানীয় সময় পেতে , আপনাকে কেবল এটি করা দরকার:

convertedDate.ToLocalTime();

পরিবর্তনের পদক্ষেপ Kindএর DateTimeথেকে Unspecifiedথেকে UTCঅপ্রয়োজনীয়। Unspecifiedএটি হ'ল : http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx এরUTC উদ্দেশ্যে বিবেচিত হবেToLocalTime


6
এবং তদ্বিপরীত: convertedDate.FromLocalTime();রূপান্তর করা হবে UTC
আর শেরুর্স

16

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি একইরকম পরিস্থিতিতে পড়েছি এবং আমি নিজেকে ভবিষ্যতে অনুসন্ধানকারীদের জন্য যা পেয়েছি তা ভাগ করে নিতে চেয়েছিলাম :)।

DateTime.Parse()জটিল হতে পারে - উদাহরণস্বরূপ এখানে দেখুন ।

যদি DateTimeকোনও ওয়েব সার্ভিস বা কোনও পরিচিত উত্স সহ অন্য কোনও উত্স থেকে আসে তবে আপনি এর মতো কিছু বিবেচনা করতে চাইতে পারেন

DateTime.ParseExact(dateString, 
                   "MM/dd/yyyy HH:mm:ss", 
                   CultureInfo.InvariantCulture, 
                   DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)

বা, আরও ভাল,

DateTime.TryParseExact(...)

AssumeUniversalপতাকা পার্সার যে তারিখ / সময় ইতিমধ্যে ইউটিসি হয় বলে; এর সংমিশ্রণ AssumeUniversalএবং AdjustToUniversalফলাফলকে "স্থানীয়" সময়ে রূপান্তর না করার জন্য বলে, যা এটি ডিফল্টরূপে করার চেষ্টা করবে। (আমি ব্যক্তিগতভাবে ইউটিসির সাথে ব্যবসায় / অ্যাপ্লিকেশন / পরিষেবা স্তর (গুলি) তে একচেটিয়াভাবে ডিল করার চেষ্টা করি But তবে স্থানীয় সময় রূপান্তরকে বাইপাস দিয়ে জিনিসগুলিকেও গতি দেয় - আমার পরীক্ষায় 50% বা তারও বেশি নীচে দেখুন))

এখানে আমরা আগে যা করছিলাম তা এখানে:

DateTime.Parse(dateString, new CultureInfo("en-US"))

আমরা অ্যাপটির প্রোফাইল দিয়েছি এবং সন্ধান করেছি যে ডেটটাইম P পার্স সিপিইউ ব্যবহারের উল্লেখযোগ্য শতাংশের প্রতিনিধিত্ব করে। (ঘটনাচক্রে, সিপিইউ ব্যবহারে CultureInfoকনস্ট্রাক্টর কোনও উল্লেখযোগ্য অবদানকারী ছিল না ))

তাই আমি বিভিন্ন উপায়ে 10000 বার তারিখ / সময় স্ট্রিংকে পার্স করার জন্য একটি কনসোল অ্যাপ সেট আপ করেছি set বটম লাইন:
Parse()10 সেকেন্ড
ParseExact()20-45 MS (স্থানীয় রূপান্তর)
ParseExact()(স্থানীয় রূপান্তর নয়) 10-15 MS
... এবং হ্যাঁ, এর জন্য ফলাফল Parse()রয়েছে সেকেন্ড , যেহেতু অন্যদের মধ্যে হয় মিলিসেকেন্ড


14

আমি কেবল সাবধানতার একটি সাধারণ নোট যুক্ত করতে চাই।

আপনি যে যা করছেন তা যদি কম্পিউটারের অভ্যন্তরীণ ঘড়ি থেকে প্রদর্শনের সময় বা একটি রিপোর্টে একটি তারিখ / সময় রাখার জন্য বর্তমান সময়টি পেয়ে থাকে তবে সমস্ত কিছু ঠিক আছে। তবে আপনি যদি পরবর্তী রেফারেন্সের জন্য তারিখ / সময় তথ্য সংরক্ষণ করেন বা তারিখ / সময় গণনা করছেন , সাবধান!

ধরা যাক আপনি নির্ধারণ করেছেন যে একটি ক্রুজ শিপ হোনোলুলুতে 20 ডিসেম্বর 2007 এ 15:00 ইউটিসি-তে এসেছিল। এবং আপনি জানতে চান স্থানীয় সময়টি কী ছিল।
1. সম্ভবত অন্তত তিন 'স্থানীয়' জড়িত আছে। স্থানীয় অর্থ হোনোলুলু হতে পারে, বা এটির অর্থ আপনার কম্পিউটারটি কোথায় রয়েছে তার অর্থ হতে পারে বা আপনার গ্রাহক অবস্থিত সেই অবস্থানের অর্থ হতে পারে।
২. আপনি যদি রূপান্তরটি করতে অন্তর্নির্মিত ফাংশনগুলি ব্যবহার করেন তবে এটি সম্ভবত ভুল হবে। এর কারণ হ'ল দিবালোক সঞ্চয় সময় (সম্ভবত) বর্তমানে আপনার কম্পিউটারে কার্যকর, তবে ডিসেম্বরে কার্যকর হয়নি। তবে উইন্ডোজ এটি জানে না ... দিবালোক সংরক্ষণের সময়টি কার্যকর হচ্ছে কিনা তা নির্ধারণ করার জন্য এটির সমস্তই একটি পতাকা। এবং যদি এটি বর্তমানে কার্যকর হয়, তবে এটি আনন্দের সাথে ডিসেম্বর মাসের একটি তারিখে এমনকি আরও এক ঘন্টা যোগ করবে।
3।দিবালোক সংরক্ষণের সময় বিভিন্ন রাজনৈতিক মহকুমায় (বা মোটেও নয়) আলাদাভাবে প্রয়োগ করা হয়। আপনার দেশটি নির্দিষ্ট তারিখে পরিবর্তিত হওয়ার কারণে, অন্য দেশগুলিও তা পরিবর্তন করবে না বলে মনে করবেন না।


6
আসলে, # 2 সম্পূর্ণরূপে সঠিক নয়। প্রতি টাইমজোনগুলিতে ডিএসটি সম্পর্কে প্রকৃত নিয়ম রয়েছে যা আপনার কম্পিউটারটি জানবে যে তথ্য ইনস্টল করা হয়েছে (এবং আপডেট হয়েছে)। অনেক জোনের জন্য, এই নিয়মগুলি স্থির। অন্যরা "গতিশীল ডিএসটি" প্রয়োগ করে। ব্রাজিল এটির জন্য আমার পোষা প্রাণবন্ত। যদিও সংক্ষেপে বলা যায়, আপনার স্থানীয় সময় ডিসেম্বরে ডিএসটি হবে কিনা তা ধরে নিয়েই, এই কাজটি ধরে নিতে পারে যে এখনকার সময়ের মধ্যে আইনে কোনও পরিবর্তন করা হয় না।
রজার উইলককস

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


5

আপনার ইতিমধ্যে একটি ডেটটাইম অবজেক্ট রয়েছে কিনা তা ভুলে যাবেন না এবং এটি ইউটিসি বা স্থানীয় কিনা তা নিশ্চিত না থাকলে অবজেক্টের পদ্ধতিগুলি সরাসরি ব্যবহার করা যথেষ্ট সহজ:

DateTime convertedDate = DateTime.Parse(date);
DateTime localDate = convertedDate.ToLocalTime();

আমরা কীভাবে অতিরিক্ত ঘন্টা সামঞ্জস্য করব?

নির্দিষ্ট না করা। নেট স্থানীয় পিসি সেটিংস ব্যবহার করবে। আমার এইগুলি পড়তে হবে: http://msdn.microsoft.com/en-us/library/system.globalization.daylighttime.aspx

বর্ণ অনুসারে কোডটি দেখতে এমন কিছু দেখতে পাবে:

DaylightTime daylight = TimeZone.CurrentTimeZone.GetDaylightChanges( year );

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


সিস্টেমটি আপনার জন্য এই স্বাচ্ছন্দ্যের মোকাবিলা করবে, আপনি আপনার তারিখটি কী 'ধরণের' (স্থানীয় / ইউটিসি / অনির্ধারিত) সিস্টেমকে জানান provided
ড্রয় নোকস

2

ডানার পরামর্শের উত্তরে:

কোড নমুনা এখন দেখে মনে হচ্ছে:

string date = "Web service date"..ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);            
DateTime dt = TimeZone.CurrentTimeZone.ToLocalTime(convertedDate);

আসল তারিখটি 20/08/08; প্রকারটি ছিল ইউটিসি।

"রূপান্তরিত তারিখ" এবং "ডিটি" উভয়ই একই:

21/08/08 10:00:26; ধরনের স্থানীয় ছিল


এটির ব্যাখ্যার জন্য দয়া করে আমার উত্তরটি দেখুন।
ড্রয় নোকস

1

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

আপনি যদি এটি পরিবর্তন না করতে চান তবে এটি অনির্ধারিতে সেট করুন


1

টুইটার এপিআইয়ের মাধ্যমে আপনি ফিরে আসার ইউটিসির তারিখগুলি নিয়ে আমার সমস্যা হচ্ছে বলে আমি এই প্রশ্নটি নিয়ে এসেছি (একটি স্ট্যাটাসে তৈরি_এটি ফিল্ড); আমার সেগুলি ডেটটাইমে রূপান্তর করা দরকার। এই পৃষ্ঠার উত্তরের উত্তর / কোডের নমুনাগুলির কোনওটিই আমাকে "স্ট্রিংকে বৈধ ডেটটাইম হিসাবে স্বীকৃতি দেয়নি" ত্রুটি পাওয়া আটকাতে যথেষ্ট ছিল না (তবে এটি এসওয়ের সঠিক উত্তরটি খুঁজে পেতে আমার কাছে সবচেয়ে কাছের)

পোস্ট এই লিঙ্কে এখানে ক্ষেত্রে এই অন্য কেউ সহায়তা করে - উত্তর আমার প্রয়োজন এই ব্লগ পোস্টে পাওয়া যায় নি: http://www.wduffy.co.uk/blog/parsing-dates-when-aspnets-datetimeparse-doesnt-work/ - মূলত ডেটটাইম.পার্সএক্সেক্টটি ডেটটাইম.পার্সের পরিবর্তে ফর্ম্যাট স্ট্রিং সহ ব্যবহার করুন

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