কীভাবে মার্জিতভাবে সময় অঞ্চলগুলির সাথে ডিল করবেন


140

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

  1. ইউটিসিতে বর্তমান সময় পাওয়া (এর সাথে সহজে সমাধান করা DateTime.UtcNow)।

  2. ডাটাবেস থেকে তারিখ / সময় টানতে এবং ব্যবহারকারীর কাছে এগুলি প্রদর্শন করা। সেখানে সম্ভাব্য হয় প্রচুর বিভিন্ন মতামত তারিখগুলি প্রিন্ট করতে কল। আমি ভিউ এবং নিয়ন্ত্রণকারীদের মধ্যে কিছু স্তর সম্পর্কে ভাবছিলাম যা এই সমস্যাটি সমাধান করতে পারে। অথবা একটি কাস্টম এক্সটেনশন পদ্ধতি চালু DateTime(নীচে দেখুন)। প্রধান নীচের দিকটি হ'ল ভিউতে ডেটটাইম ব্যবহারের প্রতিটি জায়গাতেই এক্সটেনশন পদ্ধতিটি কল করতে হবে!

    এটি এর মতো কিছু ব্যবহার করতে অসুবিধা যুক্ত করবে JsonResult। আপনি আর সহজে কল করতে পারবেন না Json(myEnumerable), এটি হতে হবে Json(myEnumerable.Select(transformAllDates))। হয়তো অটোম্যাপার এই পরিস্থিতিতে সাহায্য করতে পারে?

  3. ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়া (স্থানীয় থেকে ইউটিসি)। উদাহরণস্বরূপ, একটি তারিখ সহ একটি ফর্ম পোস্ট করার আগে তারিখটিকে ইউটিসিতে রূপান্তর করা দরকার। প্রথম যে বিষয়টি মনে আসে তা হ'ল একটি প্রথা তৈরি করা ModelBinder

আমি যে সমস্ত এক্সটেনশানগুলি ভিউগুলিতে ব্যবহার করার কথা ভেবেছিলাম তা এখানে:

public static class DateTimeExtensions
{
    public static DateTime UtcToLocal(this DateTime source, 
        TimeZoneInfo localTimeZone)
    {
        return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
    }

    public static DateTime LocalToUtc(this DateTime source, 
        TimeZoneInfo localTimeZone)
    {
        source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
        return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
    }
}

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

এর আগে কি সুন্দরভাবে সমাধান করা হয়েছে? আমি কি অনুপস্থিত কিছু আছে? ধারণা এবং চিন্তা অনেক প্রশংসা করা হয়।

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


3
আপনার এই দুর্দান্ত পোস্টের মাধ্যমে প্রথমে একটি পঠন থাকতে পারে ... দিবালোকের সময় সাশ্রয় করার সময় এবং টাইমজোন সেরা অনুশীলনগুলি
ডডজি_কোডার

@ ডডজি_কোডার - এটি সর্বদা সময় অঞ্চলগুলির জন্য একটি দুর্দান্ত সংস্থান ছিল। তবে এটি সত্যিই আমার কোনও সমস্যা (বিশেষত এমভিসি সম্পর্কিত) সমাধান করে না। ধন্যবাদ যদিও.
দ্য ক্লাউডলেসস্কি

কোড.google.com/p/noda- সময় দরকারী হতে পারে
অ্যারনিস ল্যাপসা

আপনি যে সমাধানটি বেছে নিয়েছেন তা আগ্রহী। নিজেও একই সিদ্ধান্তের মুখোমুখি। ভাল প্রশ্ন.
শান

@ সীন - সমাধান এখনও পর্যন্ত মার্জিত হয়নি (এজন্য আমি এখনও একটি উত্তর গ্রহণ করতে পারি নি)। এটি মুদ্রণের তারিখগুলি / সময়গুলির অনেকগুলি ম্যানুয়াল ওভারহেড হয়েছে এবং ম্যানুয়ালি এটিকে তাদের সাথে আবার রূপান্তর করেছে ModelBinder
দ্য ক্লাউডলেসস্কি

উত্তর:


106

এটি একটি প্রস্তাবনা নয়, এটি একটি দৃষ্টান্তের আরও ভাগ করে নেওয়া, তবে ওয়েব অ্যাপে টাইমজোন তথ্য পরিচালনা করার জন্য সবচেয়ে আক্রমণাত্মক উপায় (যা এএসপি.নেট এমভিসির সাথে একচেটিয়া নয়) নিম্নলিখিত ছিল:

  • সার্ভারে সমস্ত তারিখের সময়গুলি ইউটিসি হয়। এর অর্থ হল, যেমন আপনি বলেছেন, ব্যবহার করা DateTime.UtcNow

  • ক্লায়েন্ট যত তাড়াতাড়ি সম্ভব সার্ভারে তারিখগুলি পাস করার বিষয়ে বিশ্বাস করার চেষ্টা করুন। উদাহরণস্বরূপ, আপনার যদি "এখন" প্রয়োজন হয়, ক্লায়েন্টের উপর একটি তারিখ তৈরি করবেন না এবং তারপরে এটি সার্ভারে প্রেরণ করুন। হয় আপনার পেতে একটি তারিখ তৈরি করুন এবং ViewModel অথবা পোস্টে এটা করতে পাস DateTime.UtcNow

এখনও পর্যন্ত, বেশ স্ট্যান্ডার্ড ভাড়া, তবে এটি এখানে জিনিসগুলি 'আকর্ষণীয়' করে।

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

  • ভিউগুলি রেন্ডার করার সময়, তারা এইচটিএমএল 5 <time>উপাদান ব্যবহার করছিল , তারা কখনও ভিউমোডেলে সরাসরি তারিখের সময় সরবরাহ করে না। এটি HtmlHelperএক্সটেনশন হিসাবে বাস্তবায়িত হয়েছিল , এর মতো কিছু Html.Time(Model.when)। এটি রেন্ডার হবে <time datetime='[utctime]' data-date-format='[datetimeformat]'></time>

    তারপরে তারা ইউটিসি সময়টিকে স্থানীয় সময়গুলিতে অনুবাদ করার জন্য জাভাস্ক্রিপ্ট ব্যবহার করবে। স্ক্রিপ্টটি সমস্ত <time>উপাদান সন্ধান করবে এবং date-formatতারিখের ফর্ম্যাট করতে এবং উপাদানটির বিষয়বস্তু জনবসতি করতে ডেটা সম্পত্তি ব্যবহার করবে ।

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

আমি বলছি না যে এটি সর্বোত্তম পন্থা ছিল, তবে এটি আগে আলাদাভাবে দেখা যায় নি। হতে পারে আপনি এ থেকে কিছু আকর্ষণীয় ধারণা সংগ্রহ করতে পারেন le


আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ. ব্যবহারকারীর কাছ থেকে তারিখ ইনপুট পাওয়ার সময় (উদাহরণস্বরূপ অ্যাপয়েন্টমেন্টের সময় নির্ধারণ), এই ইনপুটটি কি তাদের বর্তমান টাইমজোন হিসাবে ধরা হবে না? অ্যাকশনটিতে প্রবেশের আগে মডেলবাইন্ডার এই রূপান্তরটি করার বিষয়ে আপনি কী মনে করেন (@ ক্যাস্পারওনে আমার মন্তব্য দেখুন Also এছাড়াও, <time>ধারণাটি বেশ দুর্দান্ত। একমাত্র অসুবিধা হ'ল এর অর্থ হল যে এই উপাদানগুলির জন্য আমার পুরো ডিওএমকে জিজ্ঞাসা করা দরকার, যা খালি তারিখের রূপান্তর করতে খুব সুন্দর নয় (জেএস অক্ষম সম্পর্কে কী?) আবারও ধন্যবাদ!
দ্য ক্লাউডলেসস্কি

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

2
আমি তখন থেকে অন্য প্রকল্পে কাজ করেছি যেটির জন্য স্থানীয় তারিখের প্রয়োজন ছিল এবং এটি ছিল আমি ব্যবহার করা পদ্ধতি। আমি তারিখ / সময় বিন্যাস করতে moment.js ব্যবহার করছি ... এটি মিষ্টি। ধন্যবাদ!
দ্য ক্লাউডলেসস্কি

কোনও অ্যাপ্লিকেশন-স্কোপ টাইমজোন অ্যাপ্লিকেশন-কোডফাইগ / ওয়েব কোডফাইজে সংজ্ঞায়িত করার এবং এটিকে সমস্ত ডেটটাইম.নু মানগুলি ডেটটাইম-এ রূপান্তর করার সহজ উপায় নেই? এখন? (আমি পরিস্থিতি এড়াতে যেখানে কোম্পানির মধ্যে প্রোগ্রামারদের এখনো ভুল করে DateTime.Now ব্যবহার করেন চান)
উরি অ্যাব্রামসনের

3
আমি দেখতে পাচ্ছি যে এই পদ্ধতির একটি অসুবিধা হ'ল আপনি যখন অন্যান্য জিনিসগুলির জন্য সময় ব্যবহার করছেন, পিডিএফ তৈরি করছেন, ইমেলগুলি এবং এ জাতীয় জন্য সময় উপাদান নেই তখনও আপনাকে সেগুলি ম্যানুয়ালি রূপান্তর করতে হবে। অন্যথায়, খুব ঝরঝরে সমাধান
শেনকু

15

বেশ কয়েকটি ফিডব্যাকের পরে, এখানে আমার চূড়ান্ত সমাধান যা আমি মনে করি এটি পরিষ্কার এবং সহজ এবং দিবালোক সংরক্ষণের বিষয়গুলি কভার করে।

1 - আমরা মডেল স্তরে রূপান্তরটি পরিচালনা করি। সুতরাং, মডেল শ্রেণিতে আমরা লিখি:

    public class Quote
    {
        ...
        public DateTime DateCreated
        {
            get { return CRM.Global.ToLocalTime(_DateCreated); }
            set { _DateCreated = value.ToUniversalTime(); }
        }
        private DateTime _DateCreated { get; set; }
        ...
    }

2 - একটি গ্লোবাল সহায়কতে আমরা আমাদের কাস্টম ফাংশনটি "ToLocalTime" করি:

    public static DateTime ToLocalTime(DateTime utcDate)
    {
        var localTimeZoneId = "China Standard Time";
        var localTimeZone = TimeZoneInfo.FindSystemTimeZoneById(localTimeZoneId);
        var localTime = TimeZoneInfo.ConvertTimeFromUtc(utcDate, localTimeZone);
        return localTime;
    }

3 - প্রতিটি ব্যবহারকারীর প্রোফাইলে টাইমজোন আইডি সংরক্ষণ করে আমরা এটি আরও উন্নত করতে পারি যাতে আমরা ধ্রুবক "চায়না স্ট্যান্ডার্ড সময়" ব্যবহার না করে ব্যবহারকারী শ্রেণি থেকে পুনরুদ্ধার করতে পারি:

public class Contact
{
    ...
    public string TimeZone { get; set; }
    ...
}

4 - এখানে আমরা একটি ড্রপডাউনবক্স থেকে নির্বাচন করতে ব্যবহারকারীর দেখানোর জন্য টাইমজোনটির তালিকা পেতে পারি:

public class ListHelper
{
    public IEnumerable<SelectListItem> GetTimeZoneList()
    {
        var list = from tz in TimeZoneInfo.GetSystemTimeZones()
                   select new SelectListItem { Value = tz.Id, Text = tz.DisplayName };

        return list;
    }
}

সুতরাং, এখন চীনের 9:25 এ, মার্কিন যুক্তরাষ্ট্রে হোস্ট করা ওয়েবসাইট, ডাটাবেসে ইউটিসিতে সংরক্ষণের তারিখ, এখানে চূড়ান্ত ফলাফল:

5/9/2013 6:25:58 PM (Server - in USA) 
5/10/2013 1:25:58 AM (Database - Converted UTC)
5/10/2013 9:25:58 AM (Local - in China)

সম্পাদনা

আসল সমাধানের দুর্বল অংশগুলি নির্দেশ করার জন্য ম্যাট জনসনকে ধন্যবাদ এবং মূল পোস্টটি মুছে ফেলার জন্য দুঃখিত, তবে সঠিক কোড ডিসপ্লে ফর্ম্যাট পেতে সমস্যা পেয়েছে ... দেখা গেছে সম্পাদক "" বুলেট "" প্রি কোড "এর সাথে মিশ্রিত করতে সমস্যা আছে, তাই আমি বুলেটগুলি সরানো হয়েছে এবং এটি ঠিক আছে।


কারও কাছে এন-টিয়ার আর্কিটেকচার বা ওয়েব লাইব্রেরি ভাগ না করা থাকলে এটি কার্যক্ষম বলে মনে হচ্ছে। আমরা কীভাবে ডেটা লেয়ারে টাইমজোন আইডি ভাগ করতে পারি।
বিকাশ কুমার

9

ইন ঘটনা অধ্যায় উপর sf4answers , ব্যবহারকারীরা এমন একটি ইভেন্টের পাশাপাশি একটি শুরুর তারিখ এবং একটি ঐচ্ছিক শেষের তারিখের জন্য একটি ঠিকানা লিখুন। এই সময়গুলিকে datetimeoffsetএসকিউএল সার্ভারে অনুবাদ করা হয়েছে যা ইউটিসি থেকে অফসেটের জন্য অ্যাকাউন্ট করে।

এটি আপনি একই সমস্যার মুখোমুখি হচ্ছেন (যদিও আপনি এটির জন্য আলাদা পদ্ধতি অবলম্বন করছেন, এতে আপনি ব্যবহার করছেন DateTime.UtcNow); আপনার একটি অবস্থান আছে এবং আপনার একটি সময় অঞ্চল থেকে অন্য সময় অনুবাদ করতে হবে।

আমি দুটি প্রধান কাজ করেছি যা আমার জন্য কাজ করেছিল। প্রথমে, সর্বদা DateTimeOffsetকাঠামো ব্যবহার করুন । এটি ইউটিসি থেকে অফসেট হিসাবে অ্যাকাউন্ট করে এবং আপনি যদি আপনার ক্লায়েন্টের কাছ থেকে এই তথ্যটি পেতে পারেন তবে এটি আপনার জীবনকে আরও সহজ করে তোলে।

দ্বিতীয়ত, অনুবাদগুলি সম্পাদন করার সময়, ধরে নেওয়া আপনি ক্লায়েন্টের অবস্থান / সময় অঞ্চলটি জানেন কিনা, আপনি সর্বজনীন তথ্য টাইম জোনের ডাটাবেসটি ইউটিসি থেকে অন্য সময় অঞ্চলে অনুবাদ করতে পারেন (অথবা যদি আপনি চান, ত্রিভুজ্যালে, দু'জনের মধ্যে সময় অঞ্চল)। Tz ডাটাবেস সম্পর্কে দুর্দান্ত জিনিস (কখনও কখনও ওলসন ডাটাবেস হিসাবে পরিচিত ) এটি ইতিহাসের সর্বত্র টাইম জোনের পরিবর্তনের জন্য দায়ী; একটি অফসেট পেয়ে তারিখ আপনি যে অফসেট করতে (ঠিক তাকান চান একটি ফাংশন 2005 সালের এনার্জি নীতি আইন যা তারিখ পরিবর্তিত যখন দিবালোক সংরক্ষণ সময় মার্কিন যুক্তরাষ্ট্রে প্রভাব মধ্যে যায় )।

হাতে থাকা ডাটাবেস সহ, আপনি জোনআইএনফো (tz ডাটাবেস / ওলসন ডাটাবেস)। নেট এপিআই ব্যবহার করতে পারেন । মনে রাখবেন যে বাইনারি বিতরণ নেই, আপনাকে সর্বশেষতম সংস্করণটি ডাউনলোড করতে হবে এবং এটি নিজেই সংকলন করতে হবে।

এই লেখার সময়, এটি বর্তমানে সর্বশেষতম ডেটা বিতরণে সমস্ত ফাইলকে বিশ্লেষণ করেছে (আমি আসলে এটিকে 25 ই সেপ্টেম্বর ftp://elsie.nci.nih.gov/pub/tzdata2011k.tar.gz ফাইলের বিরুদ্ধে চালিয়েছি , ২০১১; মার্চ মাসে, আপনি এটি https://iana.org/time-zones বা ftp://fpt.iana.org/tz/releases/tzdata2017a.tar.gz থেকে পেয়ে যাবেন )।

সুতরাং sf4answers এ, ঠিকানা পাওয়ার পরে, এটি একটি অক্ষাংশ / দ্রাঘিমাংশ সংমিশ্রণে জিওকোড করা হয় এবং তারপরে একটি সময় অঞ্চল নির্ধারণের জন্য একটি তৃতীয় পক্ষের ওয়েব সার্ভিসে প্রেরণ করা হয় যা tz ডাটাবেসে প্রবেশের সাথে মিলে যায়। সেখান থেকে শুরু এবং শেষের সময়গুলি DateTimeOffsetযথাযথ ইউটিসি অফসেটের সাথে উদাহরণগুলিতে রূপান্তরিত হয় এবং তারপরে ডাটাবেসে সঞ্চিত হয়।

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

তবে, যদি আপনার শ্রোতা স্থানীয় সময় প্রত্যাশা করে, তবে DateTimeOffsetএকটি এক্সটেনশন পদ্ধতিটি ব্যবহার করে সময় অঞ্চলকে রূপান্তর করতে সময় নেওয়া ঠিক হবে; এসকিউএল ডেটা টাইপ datetimeoffset.NET এ অনুবাদ করবে DateTimeOffsetযা আপনি পরে GetUniversalTimeপদ্ধতিটি ব্যবহারের জন্য সার্বজনীন সময় পেতে পারেন । সেখান থেকে, আপনি ZoneInfoক্লাসের পদ্ধতিগুলি ইউটিসি থেকে স্থানীয় সময়ে রূপান্তর করতে ব্যবহার করেন (এটির একটিতে আপনাকে কিছুটা কাজ করতে হবে DateTimeOffset, তবে এটি করার পক্ষে যথেষ্ট সহজ)।

রূপান্তর কোথায় করবেন? এটি এমন একটি ব্যয় যা আপনি অন্য কোথাও দিতে হবে এবং কোনও "সেরা" উপায় নেই। আমি ভিউ মডেলের অংশ হিসাবে টাইমজোনটি অফসেট সহ ভিউটি বেছে নেব। এইভাবে, যদি ভিউ পরিবর্তনের প্রয়োজনীয়তাগুলি হয় তবে আপনাকে পরিবর্তনটি সামঞ্জস্য করতে আপনার ভিউ মডেলটি পরিবর্তন করতে হবে না। তোমার JsonResultকেবল সঙ্গে একটি মডেল ধারণ করবে এবং অফসেট।IEnumerable<T>

ইনপুট দিকে, একটি মডেল বাইন্ডার ব্যবহার করছেন? আমি একেবারে কোন উপায় বলতে চাই। আপনি গ্যারান্টি দিতে পারবেন না যে সমস্ত তারিখ (এখন বা ভবিষ্যতে) এইভাবে রূপান্তর করতে হবে, এই ক্রিয়াটি সম্পাদন করা আপনার নিয়ামকের একটি স্পষ্ট ফাংশন হওয়া উচিত। আবার, প্রয়োজনীয়তাগুলি পরিবর্তিত হলে, ModelBinderআপনার ব্যবসায়ের যুক্তি সামঞ্জস্য করতে আপনাকে এক বা একাধিক দৃষ্টান্তটি পরিবর্তন করতে হবে না ; এবং এটি হল ব্যবসা লজিক, যার মানে এটা নিয়ামক হতে হবে।


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

1
@ দ্য ক্লাউডলেসস্কি: আমার সম্পাদিত প্রতিক্রিয়ার শেষ দুটি অনুচ্ছেদ দেখুন। ব্যক্তিগতভাবে, আমি মনে করি যে রূপান্তরগুলি কোথায় করা উচিত তার বিশদটি অপ্রয়োজনীয়; প্রধান সমস্যাটি হ'ল ডেটটাইম ডেটার প্রকৃত রূপান্তর এবং স্টোরেজ (বিটিডব্লিউ, আমি datetimeoffsetএসকিউএল সার্ভার এবং DateTimeOffset। নেট এ এখানে যথেষ্ট পরিমাণে ব্যবহারের উপর জোর দিতে পারি না , তারা সত্যিই অসাধারণ জিনিসগুলি সহজসাধ্য করে) যা আমার বিশ্বাস। নেট পুরোপুরি পরিচালনা করে না উপরে বর্ণিত কারণগুলির জন্য মোটামুটি। 2003 এ প্রবেশ করা NYC এ আপনার যদি একটি তারিখ থাকে এবং আপনি এটি 2011 সালে এলএ-তে একটি তারিখে অনুবাদ করতে চান, নেট এই ক্ষেত্রে শক্তভাবে ব্যর্থ হয়।
ক্যাস্পারওন

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

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

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

5

এটি কেবল আমার মতামত, আমি মনে করি এমভিসি অ্যাপ্লিকেশনটির উচিত ডেটা মডেল পরিচালনার থেকে ডেটা উপস্থাপনের সমস্যাটি আলাদা করা উচিত। একটি ডাটাবেস স্থানীয় সার্ভার সময়ে ডেটা সঞ্চয় করতে পারে তবে স্থানীয় ব্যবহারকারীর সময় অঞ্চল ব্যবহার করে ডেটটাইম রেন্ডার করা উপস্থাপনা স্তরটির একটি দায়িত্ব। এটি আমার কাছে আই 18 এন এবং একই সাথে বিভিন্ন দেশের সংখ্যার ফর্ম্যাট হিসাবে একই সমস্যা বলে মনে হচ্ছে। আপনার ক্ষেত্রে, আপনার অ্যাপ্লিকেশনটির Cultureব্যবহারকারীর এবং সময় অঞ্চল সনাক্ত করা উচিত এবং বিভিন্ন পাঠ্য, সংখ্যা এবং ডেটিম উপস্থাপনা দেখানো ভিউ পরিবর্তন করা উচিত , তবে সঞ্চিত ডেটার একই ফর্ম্যাট থাকতে পারে।


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

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

এগুলি আমি ধরণের ধরণের জিনিস খুঁজছিলাম। আপনি যদি আমার ওপিকে লক্ষ্য করেন তবে আমি অডিওম্যাপার ব্যবহার করে ভিউ / জসন ফলাফলে যাওয়ার আগে কিছু প্রক্রিয়াজাতকরণ করার পরেও ক্রিয়াটি কার্যকর হওয়ার পরে উল্লেখ করেছি।
দ্য ক্লাউডলেসস্কি

1

আউটপুট জন্য, এই মত একটি প্রদর্শন / সম্পাদক টেম্পলেট তৈরি করুন

@inherits System.Web.Mvc.WebViewPage<System.DateTime>
@Html.Label(Model.ToLocalTime().ToLongTimeString()))

আপনি যদি কেবলমাত্র কিছু নির্দিষ্ট মডেল those টেমপ্লেটগুলি ব্যবহার করতে চান তবে আপনি আপনার মডেলের বৈশিষ্ট্যের ভিত্তিতে এগুলি আবদ্ধ করতে পারেন।

কাস্টম সম্পাদক টেম্পলেট তৈরি করার বিষয়ে আরও তথ্যের জন্য এখানে এবং এখানে দেখুন ।

বিকল্পভাবে, যেহেতু আপনি এটি ইনপুট এবং আউটপুট উভয়ের জন্য কাজ করতে চান তাই আমি একটি নিয়ন্ত্রণ বাড়ানো বা এমনকি নিজের তৈরি করার পরামর্শ দেব। এইভাবে আপনি ইনপুট এবং আউটপুট উভয়ই বাধা দিতে পারেন এবং প্রয়োজনীয় পাঠ্য / মান রূপান্তর করতে পারেন।

আপনি যদি সেই পথে যেতে চান তবে এই লিঙ্কটি আশা করি আপনাকে সঠিক দিকে নিয়ে যাবে।

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


আমি কাস্টম প্রদর্শন / সম্পাদক টেম্পলেট এবং বাইন্ডার সর্বাধিক মার্জিত সমাধান, কারণ এটি একবার কার্যকর হলে "কেবলমাত্র কাজ করবে"। কোন ডেভেলপার বিশেষ কিছু জানতে কাজ ডান মাত্র ব্যবহার তারিখগুলি পেতে প্রয়োজন হবে DisplayForএবং EditorForএবং এটি প্রত্যেক সময় কাজ করবে। +1
কেভিন স্ট্রাইকার

17
এটি কি অ্যাপ্লিকেশন সার্ভারের সময় সরবরাহ করবে না এবং ব্রাউজারের সময় নয়?
অ্যালেক্স

0

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

আমি কল্পনা করি যে পোস্টশার্প বা নিয়ন্ত্রণ ধারকটির কিছু বিপরীত ব্যবহার করে এটি অর্জন করা যেতে পারে।

ব্যক্তিগতভাবে, আমি কেবল আপনার তারিখের সময়গুলিকে ইউআই-তে রূপান্তরিত করে যেতে চাই ...

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