দিবালোক সংরক্ষণের সময় স্থানীয় সময় পেতে কীভাবে টাইমজোনআইফো ব্যবহার করবেন?


85

আমি যে DateTimeOffsetকোনও সময় অঞ্চল জুড়ে একটি নির্দিষ্ট মুহূর্তটি সময় দেওয়ার জন্য ব্যবহার করার চেষ্টা করছি । TimeZoneInfoদিবালোকের সময় সাশ্রয় করার সময় কীভাবে মোকাবেলা করতে পারি তা আমি বুঝতে পারি না ।

var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());

var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset));

এটি মুদ্রণ করে:

6/2/2010 4:37:19 অপরাহ্ন
6/2/2010 3:37:19 অপরাহ্ন -06: 00

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

6/2/2010 4:37:19 অপরাহ্ন -05: 00

BaseUtcOffset স্পষ্টতই DST এর উপর ভিত্তি করে পরিবর্তন হয় না।

সঠিক অফসেট মান সহ আমি কীভাবে সঠিক সময় পেতে পারি?


13
+1 - এটি আমাকে পাগল করে তোলে যে টাইমজোনআইএনফো.কনভার্টটাইমবিসাইটিসটাইমজোনআইড কেবল এই জন্য কাজ করে না :)
জেমস ম্যানিং

@ জেমসম্যানিং - এটি ঠিক আছে, ধরে নিচ্ছি dt.Kindসঠিকভাবে সেট করা আছে।
ম্যাট জনসন-পিন্ট

উত্তর:


63

আপনাকে টাইমজোনআইএনফো থেকে ইউটাক্সফেসটি পেতে হবে, তারপরে এটি টুঅফসেট () পদ্ধতিতে পাস করুন:

var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());

var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)));

আমি দেখতে পেয়েছি ... আপনি টাইম জোনে সেই নির্দিষ্ট তারিখের জন্য ইউটিসি অফসেট পাবেন। ধন্যবাদ
জামিনতো

6
কার্ল জের্তসেনের উত্তরের তুলনায় এটি সেরা উপায় নয় যা একটি নতুন, থ্রো-অ্যাওয়ে তৈরির মাধ্যমে অফসেটটি বের করার পরিবর্তে কাজ করার জন্য একটি একক। নেট ফাংশন ব্যবহার করে DateTimeOffset
এরিক

60

আপনি টাইমজোনআইএনফোও ব্যবহার করতে পারেন on কনভার্টটাইমফ্রিম ইউটিসি, যা দিবালোকের সময় সাশ্রয়ের সময়কে অনুমতি দেবে:

DateTime utc = DateTime.UtcNow;
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);

আমার দেশের টাইমজোন গ্রীষ্মে EEST এবং শীতে EET হয় তবে কী হবে? দিবালোক সংরক্ষণের সাথে কীভাবে এটি কাজ করবে?
রামি জেবিয়ান

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

11

বা আরও ভাল, যদি আপনি সময় অঞ্চল শনাক্তকারীকে হার্ড কোড করতে না চান :

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id);
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);

4
আপনি কি TimeZoneInfo.Localসরাসরি ব্যবহার করতে পারবেন না ? তোমার কাছে কেন কল দরকার FindSystemTimeZoneById?
কোডারডেনিস

4
আপনি ঠিক বলেছেন, আমাদের এটির দরকার নেই। আমরা কেবল এটির মতোই করতে পারিDateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(networkDateTime, TimeZoneInfo.Local);
পাইবিনেটর

4
তবে তারপরে আপনি একক সময় অঞ্চলে স্থির হয়ে গেছেন। আমার অনুমানের কোডটি আপনি কীভাবে ব্যবহার করতে চান তার উপর নির্ভর করে। :-)
কার্ল জের্তসেন

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

5

আমি নেট এবং স্ট্যাকওভারফ্লো উভয়ই একজন শিক্ষানবিস, সুতরাং আমি ভুল হতে পারি, তবে এখানে যায়:

টাইমজোনআইএনফো.কনভার্টটাইমফ্র্যামউটিসি ব্যবহার করে দিবালোকের সময় সাশ্রয় করতে পারে এবং সময় অঞ্চল + একটি সম্ভাব্য ডিএসটি অফসেট অনুসারে সঠিক সময়ে রূপান্তর করতে পারে। তবে - ফলস্বরূপ অবজেক্টে অফসেট নিজেই স্ট্যান্ডার্ড সময়ের জন্য অফসেটটি দেখায় এবং দিবালোক সংরক্ষণের সময়টিকে অ্যাকাউন্টে নেয় না। সুতরাং আপনি যদি অবজেক্টটিতে টোস্ট্রিং করতে চান, আপনি সঠিক সময় (ঘন্টা এবং মিনিটের মধ্যে) শেষ করবেন, তবে দিবালোক সংরক্ষণের সময় ভুল অফসেট হবে যা পরবর্তী সময়ে কোডটিতে ভুল মুহুর্তের দিকে নিয়ে যেতে পারে।

আপনি যদি পরিবর্তে নির্দিষ্ট সময়ের জন্য অফসেটটি পেতে getUtcOffset ব্যবহার করেন এবং তারপরে ডেটটাইম অফসেট অবজেক্টে একটি টুঅফসেট করেন তবে ঘন্টা / মিনিট এবং অফসেট উভয়ই সঠিকভাবে রূপান্তরিত হবে এবং আপনি নিরাপদে একটি টসস্ট্রিং করতে পারেন।

string ExpectedDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss''zzz";
string timeZoneId = "FLE Standard Time";
string dateTimestr = "2017-10-09T09:00:00+02:00";

DateTimeOffset dto = DateTimeOffset.Parse(dateTimeStr);
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
TimeSpan offset = zone.GetUtcOffset(dto);
dto = dto.ToOffset(offset);
string localTime = dto.ToString(ExpectedDateTimePattern);

লোকালটাইম "2017-10-09T10: 00: 00 + 03: 00" ফিরে আসবে।


ওপি অনুসারে এটি সঠিক উত্তর। মূল বিষয়টি বুঝতে হবে যে টিমজোনটির জন্য উতকফসেট ধ্রুবক নয়, পরিবর্তে দিবালোক সংরক্ষণের নিয়মের কারণে আমরা কী বিষয়ে কথা বলছি তা তার উপর নির্ভর করে । সুতরাং ওপি যা করেছে তার একমাত্র ভুলটি হ'ল তিনি স্থির বেসঅ্যাটকফসেটটি পরিবর্তে গেটউটকফসেট (মাইডেট) ব্যবহার করেছেন
g.pickardou
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.