রাউন্ডিং ডেটটাইম অবজেক্টস


105

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

static DateTime Round(this DateTime date, TimeSpan span);

ধারণাটি হ'ল আমি যদি দশ মিনিটের টাইমস্প্যানে পাস করি তবে এটি নিকটতম দশ মিনিটের বিরতিতে চলে যাবে। আমি বাস্তবায়নের আশেপাশে আমার মাথা পেতে পারি না এবং আশা করছি যে আপনারা কেউ এর আগেও এরকম কিছু লিখেছেন বা ব্যবহার করেছেন।

আমি মনে করি কোনও তল, সিলিং বা নিকটতম বাস্তবায়ন ঠিক আছে।

কোন ধারনা?

সম্পাদনা করুন: @ ট্যানফসন এবং @ শুগি কুককে ধন্যবাদ, বাস্তবায়নটি এরকম দেখাচ্ছে:

public static class DateExtensions {
    public static DateTime Round(this DateTime date, TimeSpan span) {
        long ticks = (date.Ticks + (span.Ticks / 2) + 1)/ span.Ticks;
        return new DateTime(ticks * span.Ticks);
    }
    public static DateTime Floor(this DateTime date, TimeSpan span) {
        long ticks = (date.Ticks / span.Ticks);
        return new DateTime(ticks * span.Ticks);
    }
    public static DateTime Ceil(this DateTime date, TimeSpan span) {
        long ticks = (date.Ticks + span.Ticks - 1) / span.Ticks;
        return new DateTime(ticks * span.Ticks);
    }
}

এবং তাই বলা হয়:

DateTime nearestHour = DateTime.Now.Round(new TimeSpan(1,0,0));
DateTime minuteCeiling = DateTime.Now.Ceil(new TimeSpan(0,1,0));
DateTime weekFloor = DateTime.Now.Floor(new TimeSpan(7,0,0,0));
...

চিয়ার্স!


1
এখানে কিছু বাস্তবায়নও খুব সাহায্য করতে পারে: stackoverflow.com/questions/766626/…
ম্যাট হ্যামিল্টন


3
নতুন তৈরি তারিখের সাথে মূল ডেটটাইমকিন্ড যুক্ত করতে ভুলবেন না যেমন: নতুন ডেটটাইম (টিক্স * স্প্যান.টিক্স, ডেট.কিন্ড);
এএম

উত্তর:


130

মেঝে

long ticks = date.Ticks / span.Ticks;

return new DateTime( ticks * span.Ticks );

গোল (মিডপয়েন্টে উপরে)

long ticks = (date.Ticks + (span.Ticks / 2) + 1)/ span.Ticks;

return new DateTime( ticks * span.Ticks );

ছাদ

long ticks = (date.Ticks + span.Ticks - 1)/ span.Ticks;

return new DateTime( ticks * span.Ticks );

5
আমি সম্প্রতি একটি ইস্যুতে দৌড়েছি যেখানে ডেটটাইমকিন্ড সংরক্ষণ করা হয়নি। প্রতিটি পদ্ধতিতে নিম্নলিখিত পংক্তিতে নিম্নলিখিত টুইটগুলি আমার ক্ষেত্রে সহায়তা করেছে:return new DateTime(ticks * span.Ticks, date.Kind);
পিট

39

এটি আপনাকে প্রদত্ত যে কোনও বিরতিতে গোল করতে দেবে। এটি বিভাজক এবং তারপরে টিকগুলি গুণনের চেয়ে কিছুটা দ্রুত।

public static class DateTimeExtensions
{
  public static DateTime Floor(this DateTime dateTime, TimeSpan interval)
  {
    return dateTime.AddTicks(-(dateTime.Ticks % interval.Ticks));
  }

  public static DateTime Ceiling(this DateTime dateTime, TimeSpan interval)
  {
    var overflow = dateTime.Ticks % interval.Ticks;

    return overflow == 0 ? dateTime : dateTime.AddTicks(interval.Ticks - overflow);
  }

  public static DateTime Round(this DateTime dateTime, TimeSpan interval)
  {
    var halfIntervalTicks = (interval.Ticks + 1) >> 1;

    return dateTime.AddTicks(halfIntervalTicks - ((dateTime.Ticks + halfIntervalTicks) % interval.Ticks));
  }
}

11

আপনি যদি আপনার বৃত্তাকারটি চান তবে আপনার স্পষ্ট হওয়া উচিত:

  1. বিরতি শুরু, শেষ বা মাঝখানে হতে
    • শুরুটি সবচেয়ে সহজ এবং প্রায়শই প্রত্যাশিত তবে আপনার প্রাথমিক অনুমানে আপনার পরিষ্কার হওয়া উচিত।
  2. আপনি কীভাবে বাউন্ডারি কেসগুলি গোল করতে চান।
    • সাধারণত যদি আপনি শেষের চেয়ে মাঝখানে গোল করে থাকেন তবে কেবল একটি ইস্যু।
    • যেহেতু মাঝখানে গোল করা একটি পক্ষপাত মুক্ত জবাবের একটি প্রচেষ্টা তাই আপনাকে পক্ষপাত থেকে সত্যিকার অর্থে মুক্ত হতে এমনকি প্রযুক্তিগত দিক থেকে রাউন্ডিংয়ের মতো কিছু ব্যবহার করা উচিত।

এটি সম্ভবত সম্ভবত আপনি প্রথম পয়েন্টটি যত্নশীল কিন্তু এই 'সাধারণ' প্রশ্নগুলিতে আপনি বাস্তব বিশ্বে এটি ব্যবহার করার ফলে ফলস্বরূপ আচরণের সুদূরপ্রসারী পরিণতি ঘটতে পারে (প্রায়শই শূন্যের সংলগ্ন বিরতিতে)

tvanfosson এর সমাধান এর 1 এর তালিকাভুক্ত সমস্ত কেস কভার করেছে মিডপয়েন্ট উদাহরণটি উপরের দিকে পক্ষপাতদুষ্ট। সন্দেহজনক যে সময় সম্পর্কিত রাউন্ডে এটি সমস্যা হবে problem


3

বিভক্ত করতে, ফ্লোর / সিল / মানটি বৃত্তাকারে ব্যবহার করে কেবল এটি টিকগুলি ব্যবহার করুন এবং এটি আবার গুন করুন।


-2

আপনি যদি কেবল আওয়ার থেকে সিলিংয়ের মানটি করতে চান

Console.WriteLine(DateTime.Now.ToString("M/d/yyyy hh:00:00"));

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