DateTimeOffset থেকে টাইম জোন অফসেট সরানো হচ্ছে। DateTimeOffset শূন্য তারিখ অফসেট sql সার্ভার থেকে টাইমজোন অফসেট সরানো হচ্ছে

DateTimeOffset testDateAndTime = নতুন DateTimeOffset(2008, 5, 1, 8, 6, 32, নতুন TimeSpan(1, 0, 0)); //পরিষ্কার সময় এবং তারিখ testDateAndTime = testDateAndTime.DateTime.Date; var datesTableEntry = db.DatesTable.First(dt => dt.Id == someTestId); datesTableEntry.test= testDateAndTime; db.SaveChangesAsync();

ডেটাবেসে ফলাফল: 2008-05-01 00:00:00.0000000 -04:00

কীভাবে সক্রিয় করবেন -4:00 থেকে +00:00 (সংরক্ষণের আগে কোড থেকে)?

আমি চেষ্টা করেছি:

পাবলিক টাস্ক SetTimeZoneOffsetToZero(DateTimeOffset dateTimeOffSetObj) ( TimeSpan zeroOffsetTimeSpan = new TimeSpan(0, 0, 0, 0, 0); রিটার্ন dateTimeOffSetObj.ToOffset(zeroOffsetTimeSpan);)

সে কিছুই করে না।

শেষ লক্ষ্য হল কেবলমাত্র কোনো সময় বা টাইমজোন অফসেট ছাড়াই একটি তারিখ থাকা। আমি সময়কে অন্য টাইম জোনে রূপান্তর করতে চাই না (অর্থাৎ 00:00:00.0000000 আমি চাই না এটি 00:00:00.0000000 সময় থেকে 4 ঘন্টা বিয়োগ করুক এবং 00:00:00.0000000 +00 দ্বারা সেট করা সময় অফসেট করুক :00 , আমি শুধু চাই যে এটি অফসেটকে +00:00 এ সেট করুক)। আমি শূন্য অফসেট সহ বর্তমান তারিখ চাই।

সম্পাদনা:

এখানে আপনি অন্য কোথাও কি অফার করতে পারেন:

DateTimeOffset testDateAndTime = নতুন DateTimeOffset(2008, 5, 1, 8, 6, 32, নতুন TimeSpan(1, 0, 0)); testDateAndTime = testDateAndTime.DateTime.Date; //জিরো আউট টাইম অংশ testDateAndTime = DateTime.SpecifyKind(testDateAndTime.Date, DateTimeKind.Utc); // "জিরো আউট" অফসেট অংশ

আমি নিশ্চিত ছিলাম যে SpecifyKind আমার dateTimeOffset নির্দিষ্ট করবে, যেমন সময় এবং টাইমজোন অফসেট উভয়ই পরিবর্তন করে, কিন্তু যখন পরীক্ষা করা হয়, তখন মনে হয় শুধু টাইমজোন অফসেট পরিবর্তন করে, যা আমি চাই। এই সঙ্গে একটি সমস্যা আছে?

1টি উত্তর

সমস্যাটির সাথে ডাটাবেসের কোন সম্পর্ক নেই। যদি আপনি একটি ব্রেকপয়েন্ট সেট করেন বা কোথাও একটি আউটপুট নিবন্ধন করেন, তাহলে আপনি এই কোডের পরেই অফসেটটি আবদ্ধ দেখতে পাবেন:

TestDateAndTime = testDateAndTime.DateTime.Date;

আসুন এটি ভেঙে দেওয়া যাক:

  • আপনি DateTimeOffset 2008-05-01T08:06:32+01:00 দিয়ে শুরু করেছেন
  • তারপরে আপনি .DateTime কল করলেন, যার ফলে তারিখের মান 2008-05-01T08:06:32 এর সাথে DateTimeKind.Unspecified.
  • তারপরে আপনি .Date কল করলেন, যার ফলে তারিখের মান 2008-05-01T00:00:00 এর সাথে DateTimeKind.অনির্দিষ্ট হয়েছে।
  • আপনি testDateAndTime-এ ফলাফল ফেরত দেন যা DateTimeOffset টাইপের। এটি DateTime থেকে DateTimeOffset-এ একটি অন্তর্নিহিত রূপান্তর ঘটায় যা স্থানীয় সময় অঞ্চলে প্রযোজ্য. আপনার ক্ষেত্রে, মনে হচ্ছে আপনার স্থানীয় টাইমজোনে এই মানের জন্য অফসেট হল -04:00 , তাই ফলস্বরূপ মান হল DateTimeOffset 2008-05-01T00:00:00-04:00 যেমন আপনি বর্ণনা করেছেন,

তুমি বলেছিলে:

শেষ লক্ষ্য হল কেবলমাত্র কোনো সময় বা টাইমজোন অফসেট ছাড়াই একটি তারিখ থাকা।

ঠিক আছে, বর্তমানে কোনও নেটিভ C# ডেটা টাইপ নেই যা একটি সময় ছাড়াই একটি তারিখ। corefxlab-এ System.Time প্যাকেজে একটি বিশুদ্ধ তারিখের ধরন রয়েছে, কিন্তু এটি একটি সাধারণ উত্পাদন অ্যাপ্লিকেশনের জন্য পুরোপুরি প্রস্তুত নয়। Noda এর টাইম লাইব্রেরিতে LocalDate আছে, যা আপনি আজ ব্যবহার করতে পারেন, কিন্তু ডাটাবেসে সেভ করার আগে আপনাকে এখনও একটি নেটিভ টাইপে রূপান্তর করতে হবে। তাই এই সময়ের মধ্যে, আপনি যা করতে পারেন তা হল:

  • এই ক্ষেত্রে তারিখের ধরন ব্যবহার করতে আপনার SQL সার্ভার পরিবর্তন করুন।
  • আপনার .NET কোডে, সময় 00:00:00 এবং DateTimeKind.Unspecified এর সাথে DateTime ব্যবহার করুন। আপনাকে সময়ের অংশটি উপেক্ষা করার কথা মনে রাখতে হবে (যেহেতু নির্দিষ্ট সময় অঞ্চলে স্থানীয় মধ্যরাত ছাড়াই প্রকৃত তারিখ রয়েছে)।
  • DateTimeOffset এর পরিবর্তে DateTime-এ পরীক্ষার সতর্কতা পরিবর্তন করুন।

সাধারণভাবে, যদিও DateTimeOffset অনেক সংখ্যক পরিস্থিতির জন্য উপযুক্ত (যেমন টাইমস্ট্যাম্পিং ইভেন্ট), এটি শুধুমাত্র তারিখের মানগুলির জন্য উপযুক্ত নয়।

আমি শূন্য অফসেট সহ বর্তমান তারিখ চাই।

আপনি যদি সত্যিই এটি ডেটটাইম অফসেটের মতো চান তবে আপনি করবেন:

TestDateAndTime = নতুন DateTimeOffset(testDateAndTime.Date, TimeSpan.Zero);

যাইহোক, আমি এই বিরুদ্ধে পরামর্শ. এটি করার মাধ্যমে আপনি মূল মানের স্থানীয় তারিখ নিচ্ছেন এবং দাবি করছেন যে এটি UTC-তে রয়েছে। যদি মূল অফসেটটি শূন্য ছাড়া অন্য কিছু হয় তবে এটি একটি মিথ্যা বিবৃতি হবে। এটি পরবর্তীতে অন্যান্য ত্রুটির দিকে নিয়ে যাবে কারণ আপনি আসলে আপনার তৈরি করা একটির চেয়ে ভিন্ন সময়ের (সম্ভাব্যভাবে একটি ভিন্ন তারিখ সহ) কথা বলছেন।

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

আসুন 2016-12-31T22:00:00-04:00 থেকে শুরু করার উদাহরণটি দেখি। আপনার পদ্ধতি অনুসারে আপনার ডাটাবেসে 2016-12-31T00:00:00+00:00 সংরক্ষণ করা উচিত। যাইহোক, এই সময় দুটি ভিন্ন পয়েন্ট. প্রথমটি, UTC-তে স্বাভাবিক করা হবে, 2017-01-01T02:00:00+00:00 হবে, এবং দ্বিতীয়টি, অন্য সময় অঞ্চলে রূপান্তরিত হবে, 2016-12-30T20:00:00-04:00 হবে৷ রূপান্তর তারিখের পরিবর্তন নোট করুন. এটি সম্ভবত এমন আচরণ নয় যা আপনি আপনার অ্যাপ্লিকেশনে চান।

মানবিক বিকল্প ([লিঙ্কটি দেখতে আপনাকে অবশ্যই নিবন্ধন করতে হবে])।

সমস্যার সারমর্ম হল এই.. আপনি যদি ভুলবশত 0 এর "ডেট অফসেট" সহ একটি এসকিউএল সার্ভারে একটি ডাটাবেস স্থাপন করেন, তাহলে একটি সমস্যা দেখা দেয় যখন ডাটাবেসে টাইম টাইপের একটি বৈশিষ্ট্য থাকে, অর্থাৎ এই বৈশিষ্ট্যটি 01 এ সেট করা থাকে /01/0001 10:30:00 বা তারিখ নিবন্ধিত খালি 01.01.0001 00:00:00। এই ধরনের বিবরণ রেকর্ড করার সময়, এটি রেকর্ড করা হয় না।
ইন্টারনেটে তারা 2000 এর অফসেট সহ একটি নতুন ডাটাবেস তৈরি করার পরামর্শ দেয়।
কিন্তু আমি সত্যিই একটি নতুন ভিত্তি তৈরি করতে চাইনি। এবং সমস্ত ব্যবহারকারীর জন্য ডাটাবেসের পথ পরিবর্তন করুন।
তারপর আমি এসকিউএল-এ এই মানটি কোথায় সংরক্ষিত আছে তার পথ অনুসরণ করলাম। আমি এটি খুঁজে পেয়েছি এবং 2000 এ পরিবর্তন করেছি এবং সবকিছু ঠিক আছে ..
এবং এখন ধাপে ধাপে কোথায় পরিবর্তন করতে হবে।

সমস্ত ব্যবহারকারীদের কিক করুন।

মনোযোগ!!!

1. প্রথমে, 1C টুল ব্যবহার করে একটি ব্যাকআপ কপি তৈরি করুন, যেমন এটি *.dt এ আপলোড করুন
"অফসেট" পরিবর্তন করার আগে এটি অবশ্যই করা উচিত
যদি এটি করা না হয়, তাহলে আপনার সম্পূর্ণ ডাটাবেসে রেফারেন্স, ডক্স ইত্যাদি থাকবে।
যেখানে একটি প্রয়োজনীয় তারিখ বলা হবে 02.10.0009
কি অনুমোদিত নয়...
তাই আপনি *.dt এ আপলোড করেছেন

2. এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে যান
তালিকায় আপনার বেস খুঁজুন এবং প্লাস চিহ্ন টিপুন।
সেখানে "টেবিল" ফোল্ডারটি খুঁজুন এবং এটি খুলুন।
টেবিলের একটি গুচ্ছ খুলবে, একেবারে নীচে যান, টেবিলটি সন্ধান করুন
_YearOffset, এটিতে দাঁড়ান এবং ডান বোতাম দিয়ে "ওপেন টেবিল" আইটেমটি নির্বাচন করুন, চিত্র 1 দেখুন
মান 0 থেকে 2000 পরিবর্তন করুন
SQL সার্ভার ম্যানেজমেন্ট স্টুডিও বন্ধ করুন

3. কনফিগারে যান এবং পূর্বে সংরক্ষিত ডাটাবেস লোড করুন।

যদি এটি করা না হয়, তাহলে সমস্ত তারিখ 0009 সালের সাথে হবে।
ডাটাবেস লোড হওয়ার পরে... আপনি 1C-তে যেতে পারেন এবং নিশ্চিত করতে পারেন যে তারিখগুলি স্বাভাবিক।
ফলাফল হল যে আমরা "ডেট অফসেট 0 থেকে 2000" পরিবর্তন করেছি

কখনও কখনও এটি ঘটে যে এই বিকল্পটি এক কারণে বা অন্য কারণে ব্যবহার করা যাবে না। তারপরে আরও একটি হার্ডকোর বিকল্প রয়েছে ([লিঙ্কটি দেখতে আপনাকে অবশ্যই নিবন্ধন করতে হবে]):

এর জন্য টেবিল এবং ফিল্ড কার্সার ঘোষণা করুন

টেবিলের নাম হিসাবে objects.name, columnname হিসাবে columns.name নির্বাচন করুন
dbo.sysobjects থেকে হিসাবেবস্তু
objects.id = columns.id-এ কলাম হিসাবে dbo.syscolumns বাম যোগ করুন
যেখানে objects.xtype = "U" এবং columns.xtype = 61

টেবিল এবং ফিল্ড খুলুন

যখন @@FETCH_STATUS = 0
কাজ শুরু করুন(" হালনাগাদ"+ @TableName + "
সেট " + @ColumnName + " = ""2000- 01- 01 00:00:00" "
কোথায় " + @ColumnName + " > ""3999- 12- 31 23:59:59" "")

যতক্ষণ পূর্বের আনা সফল হয় ততক্ষণ এটি কার্যকর করা হয়।
TablesAndFields থেকে @TableName, @ColumnName-এ আনুন
শেষ

টেবিল এবং ফিল্ড বন্ধ করুন
deallocateTables এবং Fields
যাওয়া

কোনো কারসাজির আগে, ডাটাবেসের কপি করতে ভুলবেন না!

সমস্যাটির সাথে ডাটাবেসের কোন সম্পর্ক নেই। আপনি যদি একটি ব্রেকপয়েন্ট সেট করেন বা কোথাও একটি আউটপুট প্রবেশ করেন, আপনি এই কোডের পরেই অফসেটটি স্ন্যাপ করা দেখতে সক্ষম হবেন:

TestDateAndTime = testDateAndTime.DateTime.Date;

আসুন এটি ভেঙে দেওয়া যাক:

  • আপনি DateTimeOffset মান 2008-05-01T08:06:32+01:00 দিয়ে শুরু করেছেন
  • তারপরে আপনি .DateTime কল করেছেন, যার ফলে DateTimeKind.Unspecified এর সাথে DateTime 2008-05-01T08:06:32 মান হয়েছে।
  • তারপরে আপনি .Date কল করলেন, যার ফলে তারিখের মান 2008-05-01T00:00:00 এর সাথে DateTimeKind.অনির্দিষ্ট হয়েছে।
  • আপনি ফলাফলটি testDateAndTime-এ বরাদ্দ করেন, যা DateTimeOffset টাইপের। এটি DateTime থেকে DateTimeOffset পর্যন্ত একটি অন্তর্নিহিত কাস্ট ঘটায় - , যা প্রযোজ্য স্থানীয়সময় অঞ্চল. আপনার ক্ষেত্রে, মনে হচ্ছে আপনার স্থানীয় সময় অঞ্চলে এই মানের অফসেট হল -04:00 , তাই ফলস্বরূপ মান হল 2008-05-01T00:00:00-04:00 এর DateTimeOffset যেমন আপনি বর্ণনা করেছেন৷

তুমি বলেছিলে:

চূড়ান্ত লক্ষ্য হল কোন সময় বা টাইমজোন অফসেট ছাড়াই একটি তারিখ থাকা।

ওয়েল, আছে বর্তমানেএকটি নেটিভ C# ডেটা টাইপ নয়, যা শুধুমাত্র একটি সময় ছাড়াই একটি তারিখ৷ এখানে একটি বিশুদ্ধ তারিখের ধরন রয়েছে৷ সিস্টেম।সময় corefxlab-এ প্যাকেজ, কিন্তু এটি এখনও একটি সাধারণ উত্পাদন অ্যাপ্লিকেশনের জন্য পুরোপুরি প্রস্তুত নয়। নোডা টাইম লাইব্রেরিতে একটি লোকালডেট রয়েছে যা আপনি আজ ব্যবহার করতে পারেন, তবে ডাটাবেসে সংরক্ষণ করার আগে আপনাকে এখনও একটি নেটিভ টাইপে রূপান্তর করতে হবে। তাই এই সময়ের মধ্যে, আপনি যা করতে পারেন তা হল:

  • ক্ষেত্রে তারিখের ধরন ব্যবহার করতে আপনার SQL সার্ভার পরিবর্তন করুন।
  • আপনার .NET কোডে, সময় 00:00:00 এবং DateTimeKind.Unspecified এর সাথে DateTime ব্যবহার করুন। আপনাকে সময়ের অংশটি উপেক্ষা করার কথা মনে রাখতে হবে (যেহেতু নির্দিষ্ট সময় অঞ্চলে স্থানীয় মধ্যরাত ছাড়াই প্রকৃত তারিখ রয়েছে)।
  • একটি DateTimeOffset পরিবর্তে একটি DateTime হতে পরীক্ষার প্রপ পরিবর্তন করুন.

সাধারণভাবে, যদিও DateTimeOffset অনেক সংখ্যক পরিস্থিতির জন্য উপযুক্ত (যেমন টাইমস্ট্যাম্পঘটনা), এটি শুধুমাত্র তারিখের মানগুলির জন্য উপযুক্ত নয়।

আমি শূন্য অফসেট সহ বর্তমান তারিখ চাই।

আপনি যদি সত্যি চাইএটি DateTimeOffset এর মত, আপনি করতে পারেন:

TestDateAndTime = নতুন DateTimeOffset(testDateAndTime.Date, TimeSpan.Zero);

যাইহোক, আমি এটি করার পরামর্শ দিই না। এই করে আপনি নিতে স্থানীয়মূল মানের তারিখ এবং দাবি করুন যে এটি UTC-তে রয়েছে। যদি মূল অফসেটটি শূন্য ছাড়া অন্য কিছু হয় তবে এটি একটি মিথ্যা বিবৃতি হবে। এটি পরবর্তীতে অন্যান্য ত্রুটির দিকে নিয়ে যাবে কারণ আপনি আসলে আপনার তৈরি করা একটির চেয়ে ভিন্ন সময়ের (সম্ভাব্যভাবে একটি ভিন্ন তারিখ সহ) কথা বলছেন।

আপনার বোর্ডে উত্থাপিত অতিরিক্ত প্রশ্ন সম্পর্কে। DateTimeKind.Utc নির্দিষ্ট করা অন্তর্নিহিত কাস্টের আচরণ পরিবর্তন করে। স্থানীয় সময় অঞ্চল ব্যবহার করার পরিবর্তে, UTC সময় ব্যবহার করা হয়, যার সর্বদা একটি শূন্য অফসেট থাকে। ফলাফল আমি উপরে দেওয়া আরো স্পষ্ট দৃষ্টিভঙ্গি হিসাবে একই. আমি এখনও একই কারণে এই বিরুদ্ধে সুপারিশ.

2016-12-31T22:00:00-04:00 দিয়ে শুরু হওয়া একটি উদাহরণ বিবেচনা করুন। আপনার পদ্ধতি অনুসারে আপনার ডাটাবেসে 2016-12-31T00:00:00+00:00 সংরক্ষণ করা উচিত। যাইহোক, এই সময় দুটি ভিন্ন পয়েন্ট. প্রথমটি, UTC-তে স্বাভাবিক করা হবে, 2017-01-01T02:00:00+00:00 হবে, এবং দ্বিতীয়টি, অন্য সময় অঞ্চলে রূপান্তরিত হবে, 2016-12-30T20:00:00-04:00 হবে৷ রূপান্তর তারিখের পরিবর্তন নোট করুন. এটি সম্ভবত এমন আচরণ নয় যা আপনি আপনার অ্যাপ্লিকেশনে চান।

বিষয়ে প্রকাশনা