প্রদত্ত তারিখের সঠিক সপ্তাহের সংখ্যাটি পান


222

আমি অনেকগুলি গুগল করেছি এবং প্রচুর সমাধান পেয়েছি, তবে তাদের কেউই আমাকে 2012-12-31-র জন্য সঠিক সপ্তাহের নম্বর দেয় না। এমনকি এমএসডিএন ( লিঙ্ক ) এর উদাহরণও ব্যর্থ।

২০১২-১২-৩১ সোমবার, সুতরাং এটি প্রথম সপ্তাহ হওয়া উচিত, তবে আমি চেষ্টা করা প্রতিটি পদ্ধতিই আমাকে 53 দেয় I আমি চেষ্টা করেছি এমন কয়েকটি পদ্ধতি এখানে:

এমডিএসএন গ্রন্থাগার থেকে:

DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar;

return cal.GetWeekOfYear(date, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);

সমাধান 2:

return new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

সমাধান 3:

CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;

হালনাগাদ

নিম্নলিখিত পদ্ধতিটি বাস্তবে 1 ফেরত দেয় যখন তারিখটি 2012-12-31 হয়। অন্য কথায়, আমার সমস্যাটি ছিল যে আমার পদ্ধতিগুলি ISO-8601 স্ট্যান্ডার্ড অনুসরণ করে না।

// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
    // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
    // be the same week# as whatever Thursday, Friday or Saturday are,
    // and we always get those right
    DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    // Return the week of our adjusted day
    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

4
বছরের শেষে সপ্তাহ 1 কেমন হয়? আমি বলতে চাইছি আপনি কোথায় পেয়েছেন তা আমি দেখতে পাচ্ছি। তবে 53 আমার কাছে বোধগম্য।
benjer3

1
আমার কোড স্নিপেটগুলিতে আমি সংস্কৃতিআইফোন এবং স্টাফগুলি পাই। আমি ভেবেছিলাম আমার প্রোগ্রামটি তখনই জানে যে আমি কী ক্যালেন্ডার ব্যবহার করছি। (এখানে জার্মানিতে ৩১ শে ডিসেম্বর ২০১২ সপ্তাহের প্রথম সপ্তাহে 2013)
অ্যাম্বারল্যাম্পস

এই কোডটি তেমন
কার্যকরভাবে

@ cavej03 31-dec-2016 সপ্তাহটি 52 হয় এবং GetIso8601WekOfYear ৫২ ফেরত দেয় তাই আমি অনুমান করি যে এটি সঠিকভাবে কাজ করে।
মুফ্লিক্স

উত্তর:


310

এই এমএসডিএন পৃষ্ঠায় উল্লিখিত হিসাবে ISO8601 সপ্তাহ এবং। নেট সপ্তাহের সংখ্যার মধ্যে সামান্য পার্থক্য রয়েছে।

আরও ভাল ব্যাখ্যার জন্য আপনি এমএসডিএন ব্লগে এই নিবন্ধটি উল্লেখ করতে পারেন: " মাইক্রোসফ্টে আইএসও 8601 সপ্তাহের ফরমেট। নেট "

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

আপডেট নিম্নলিখিত পদ্ধতিটি আসলে 1 টি দেয় 2012-12-31যার জন্য আইএসও 8601 (যেমন জার্মানি) -তে সঠিক।

// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
    // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
    // be the same week# as whatever Thursday, Friday or Saturday are,
    // and we always get those right
    DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    // Return the week of our adjusted day
    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
} 

1
@ আইল_গুরু কী ইচ্ছা যদি সপ্তাহটি রবিবার দিয়ে শুরু হয় ?? আমি কি "সোমবার" কে "রবিবার" দিয়ে প্রতিস্থাপন করব ??
ব্যবহারকারী2012384

2
@ ব্যবহারকারী ২০১২৮৮৪ ফাই, আপনি যদি আইএসও ৮1০১ মান অনুসরণ করতে চান তবে সর্বদা প্রথম ডেঅফিউইক সোমবার হওয়া উচিত।
স্টারসেকার

1
@ আইল_গুরু আপনার এই "ঠক" দরকার নেই, যদি করেন? যতদূর আমি বলতে পারি "getWeekOfYear (সময়, ক্যালেন্ডারউইকআরুল.ফার্সফোরডায় উইক, ডেওফওইক.মোনডে);" ঠিক কাজ করে।
স্টারসেকার

2
আপনি যদি দ্বিতীয় লিঙ্কটি (মাইক্রোসফ্ট। নেট এ আইএসও 8601 সপ্তাহের বছরের ফর্ম্যাট) সন্ধান করেন তবে আপনি সরাসরি মাইক্রোসফ্ট থেকে আপনার প্রশ্নের উত্তর পেতে পারেন। উদাহরণস্বরূপ 31/12/2007 সোমবার: নেট ফাংশন সহ এটি 2007 এর 53 নম্বর সপ্তাহে ফিরে আসবে যখন আইএসও মানের জন্য এটি
২০০৩

3
আমি 2012 থেকে 2018 বছর ধরে এটি সঠিকভাবে ম্যানুয়ালি যাচাই করেছি (ধরে নিলাম যে epochconverter.com সঠিক)। আমাদের সকলকে এই বছর আনন্দিত হওয়া উচিত 2018 সালের 1 সপ্তাহে বাস্তবে একবারের জন্য প্রথম জানুয়ারিতে শুরু হয়েছিল!
আইদান

32

এক বছরে 52 সপ্তাহেরও বেশি সময় থাকতে পারে। প্রতি বছর 52 টি পূর্ণ সপ্তাহ +1 বা +2 (লিপ বছর) দিন অতিরিক্ত। তারা একটি 53 তম সপ্তাহের জন্য আপ।

  • 52 সপ্তাহ * 7 দিন = 364 দিন।

সুতরাং প্রতি বছরের জন্য আপনার কমপক্ষে একটি অতিরিক্ত দিন সময় কাটাতে হবে। লিপ বছরের জন্য দুটি। এই অতিরিক্ত দিনগুলি তাদের নিজস্ব পৃথক সপ্তাহ হিসাবে গণনা করা হয়?

কত সপ্তাহ আছে সত্যই আপনার সপ্তাহের শুরু দিনের উপর নির্ভর করে। 2012 এর জন্য এটি বিবেচনা করা যাক।

  • মার্কিন (রবিবার -> শনিবার): 52 সপ্তাহ + 2012-10-30 এবং 2012-12-31 এর জন্য একটি ছোট 2 দিনের সপ্তাহ। মোট ফলাফল 53 সপ্তাহে। এই বছরের শেষ দুটি দিন (রবিবার + সোমবার) তাদের স্বল্প সপ্তাহ তৈরি করে।

এটি সপ্তাহের প্রথম দিন হিসাবে কী ব্যবহার করে তা দেখতে আপনার বর্তমান সংস্কৃতির সেটিংস পরীক্ষা করুন।

আপনি দেখতে পাচ্ছেন যে ফলস্বরূপ 53 পাওয়া স্বাভাবিক।

  • ইউরোপ (সোমবার -> রবিবার): জানুয়ারী 2 ডিএন (2012-1-2) প্রথম সোমবার, সুতরাং এটি প্রথম সপ্তাহের প্রথম দিন। ১ লা জানুয়ারীর সপ্তাহের সংখ্যাটি জিজ্ঞাসা করুন এবং এটি গত সপ্তাহের ২০১১ সালের অংশ হিসাবে বিবেচিত হওয়ায় আপনি ৫২ ফিরে আসবেন।

এমনকি 54 তম সপ্তাহও পাওয়া সম্ভব। প্রতি 28 বছর পরে ঘটে যখন 1 জানুয়ারী এবং 31 ডিসেম্বর পৃথক সপ্তাহ হিসাবে বিবেচিত হয়। এটি অবশ্যই একটি লিপ বছর হবে।

উদাহরণস্বরূপ, 2000 সালে 54 সপ্তাহ ছিল। ১ লা জানুয়ারি (শনিবার) প্রথম এক সপ্তাহের দিন এবং ৩১ শে ডিসেম্বর (সূর্য) দ্বিতীয় এক সপ্তাহের দিন ছিল।

var d = new DateTime(2012, 12, 31);
CultureInfo cul = CultureInfo.CurrentCulture;

var firstDayWeek = cul.Calendar.GetWeekOfYear(
    d,
    CalendarWeekRule.FirstDay,
    DayOfWeek.Monday);

int weekNum = cul.Calendar.GetWeekOfYear(
    d,
    CalendarWeekRule.FirstDay,
    DayOfWeek.Monday);

int year = weekNum == 52 && d.Month == 1 ? d.Year - 1 : d.Year;
Console.WriteLine("Year: {0} Week: {1}", year, weekNum);

প্রিন্ট আউট: বছর: 2012 সপ্তাহ: 54

উপরের উদাহরণে ক্যালেন্ডারউইখরুলকে ফার্স্টফুলউইক বা ফার্স্টফোরডে উইকেতে পরিবর্তন করুন এবং আপনি 53 নম্বরে ফিরে আসবেন Let's সোমবার শুরু করার দিনটি আমরা জার্মানির সাথে কাজ করে আসছি।

সুতরাং সপ্তাহে 53 সোমবার 2012-12-31 এ শুরু হয়, একদিন স্থায়ী হয় এবং পরে থামে।

53 সঠিক উত্তর। সংস্কৃতি চেষ্টা করতে চাইলে জার্মানিতে পরিবর্তন করুন।

CultureInfo cul = CultureInfo.GetCultureInfo("de-DE");

আমি জানি যে এটি সম্ভবত 53 সপ্তাহ আছে। কিন্তু আপনি যখন রবিবার (12/30) এবং সোমবার (12/31) আছে, আপনি কি মার্কিন যুক্তরাষ্ট্রে 53 তম সপ্তাহের অংশ হিসাবে মঙ্গলবার (01/01) গণনা করবেন না?
অ্যাম্বারল্যাম্পস

আমি 54 তম সপ্তাহে কখনও দেখিনি!
অ্যাম্বারল্যাম্পস

কিছু ফিসিক্যাল সফ্টওয়্যার প্যাকেজগুলি সেগুলি রয়েছে।
ক্রিস্টোফ গিয়ার্স

ঠিক আছে, আমি খুঁজে পেয়েছি যে মার্কিন ক্যালেন্ডারগুলিতে এটি সম্ভব, তবে জার্মান ক্যালেন্ডারগুলিতে এটি ঘটবে না।
অ্যাম্বারল্যাম্পস

1
ইস্যুতে আপনার গভীর চিন্তার জন্য +1, তবে ব্লগ এন্ট্রিতে কোড স্নিপেট একটি ভিন্ন উত্তরে সরবরাহ করা আসলে আমার সমস্যাটি সমাধান করেছে।
অ্যাম্বারল্যাম্পস

22

এটাই উপাই:

public int GetWeekNumber()
{
    CultureInfo ciCurr = CultureInfo.CurrentCulture;
    int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    return weekNum;
}

CalendarWeekRuleপ্যারামিটারটির জন্য সবচেয়ে গুরুত্বপূর্ণ ।

এখানে দেখুন: https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=IT-IT&k=k(System.Globalization.ClabraWeekRule) ; k(TargetFrameworkMoniker-.NETFramework


3
"বেশিরভাগ লোক লক্ষ্য করেছেন যে ক্যালেন্ডার.গেটউইকওফিয়ার () ক্যালেন্ডারউইকরুল.ফার্সফোরডে উইক এবং ডেওউইভ.কমকে পাস করার সময় আইএসও 8601 সপ্তাহের মতো, তবে এটি কিছুটা আলাদা Spec মাইক্রোসফটস
শাঁসটান / ২০০6/০১/২০১২

1
আপনার লিঙ্কটি
ইতালীয়

নতুন ডেটটাইম (2000,12,31) এর জন্য এটি কেবল 52 টি ফেরত দেয়?
লেসেক পি

18

ভাল খবর! যোগ করার জন্য একটি টান অনুরোধSystem.Globalization.ISOWeek.NET কোরটিতে করার সবেমাত্র একত্রিত হয়েছে এবং বর্তমানে 3.0 রিলিজের জন্য রয়েছে। আশা করি এটি অন্যান্য। নেট প্ল্যাটফর্মগুলিতে খুব অদূর ভবিষ্যতে প্রচার করবে।

ধরণের নিম্নলিখিত স্বাক্ষর রয়েছে, যা বেশিরভাগ আইএসও সপ্তাহের প্রয়োজনগুলি আবরণ করে :

namespace System.Globalization
{
    public static class ISOWeek
    {
        public static int GetWeekOfYear(DateTime date);
        public static int GetWeeksInYear(int year);
        public static int GetYear(DateTime date);
        public static DateTime GetYearEnd(int year);
        public static DateTime GetYearStart(int year);
        public static DateTime ToDateTime(int year, int week, DayOfWeek dayOfWeek);
    }
}

আপনি এখানে সোর্স কোডটি পেতে পারেন ।

আপডেট : এই এপিআইগুলিকে । নেট স্ট্যান্ডার্ডের 2.1 সংস্করণে অন্তর্ভুক্ত করা হয়েছে ।


কোন ধারণা যখন ভি 3.0 প্রকাশ হবে?
জ্যাকস

"আমরা এই বছরের শেষে .NET কোর 3 এর প্রথম প্রিভিউ প্রকাশ করার পরিকল্পনা করছি এবং 2019 সালে চূড়ান্ত সংস্করণ" " ( রোডম্যাপ ব্লগ পোস্ট থেকে )
খেলাং

@খেল্যাং কিভাবে তারিখের উপর ভিত্তি করে মাসে মাসে আমি অর্ডিনাল সপ্তাহ পেতে পারি? সপ্তাহ ৩৩ পাওয়ার পরিবর্তে আমি সপ্তাহ ২ দেখতে চাই (কারণ সপ্তাহটি 33 সপ্তাহ 2 আগস্টে)। stackoverflow.com/questions/58039103/...
Roxy'Pro

11

যেহেতু এমন কোনও নেট-সংস্কৃতি বলে মনে হচ্ছে না যা সঠিক আইএসও -8601 সপ্তাহের নম্বর দেয়, তাই আমি বরং অন্তর্নির্মিত সপ্তাহের সংকল্পটি পুরোপুরি বাইপাস করতাম এবং আংশিকভাবে সংশোধন করার চেষ্টা না করে নিজেই গণনাটি করতাম ফলাফল.

আমি যা দিয়ে শেষ করেছি তা হল নিম্নলিখিত এক্সটেনশন পদ্ধতি:

/// <summary>
/// Converts a date to a week number.
/// ISO 8601 week 1 is the week that contains the first Thursday that year.
/// </summary>
public static int ToIso8601Weeknumber(this DateTime date)
{
    var thursday = date.AddDays(3 - date.DayOfWeek.DayOffset());
    return (thursday.DayOfYear - 1) / 7 + 1;
}

/// <summary>
/// Converts a week number to a date.
/// Note: Week 1 of a year may start in the previous year.
/// ISO 8601 week 1 is the week that contains the first Thursday that year, so
/// if December 28 is a Monday, December 31 is a Thursday,
/// and week 1 starts January 4.
/// If December 28 is a later day in the week, week 1 starts earlier.
/// If December 28 is a Sunday, it is in the same week as Thursday January 1.
/// </summary>
public static DateTime FromIso8601Weeknumber(int weekNumber, int? year = null, DayOfWeek day = DayOfWeek.Monday)
{
    var dec28 = new DateTime((year ?? DateTime.Today.Year) - 1, 12, 28);
    var monday = dec28.AddDays(7 * weekNumber - dec28.DayOfWeek.DayOffset());
    return monday.AddDays(day.DayOffset());
}

/// <summary>
/// Iso8601 weeks start on Monday. This returns 0 for Monday.
/// </summary>
private static int DayOffset(this DayOfWeek weekDay)
{
    return ((int)weekDay + 6) % 7;
}

প্রথমত, ((int)date.DayOfWeek + 6) % 7)সপ্তাহের দিন সংখ্যা, 0 = সোমবার, 6 = রবিবার নির্ধারণ করে।

date.AddDays(-((int)date.DayOfWeek + 6) % 7) অনুরোধ সপ্তাহের সংখ্যার আগে সোমবারের তারিখ নির্ধারণ করে।

তিন দিন পরে বৃহস্পতিবার লক্ষ্য, যা সপ্তাহটি কোন বছরের মধ্যে রয়েছে তা নির্ধারণ করে।

যদি আপনি বছরের মধ্যে (শূন্য ভিত্তিক) দিন-সংখ্যাটিকে সাত (রাউন্ড ডাউন) দ্বারা বিভক্ত করেন তবে আপনি বছরে (শূন্য ভিত্তিক) সপ্তাহের নম্বর পাবেন।

সি # তে, পূর্ণসংখ্যার গণনার ফলাফল অন্তর্নিহিতভাবে গোল হয়।


1
এটি এখন পর্যন্ত সেরা সমাধান তবে আমি এটি করার কিছুটা আলাদা উপায় নির্দেশ করব: ডেটটাইমটি প্রোলেপ্টিক গ্রেগরিয়ান ক্যালেন্ডারের উপর ভিত্তি করে তৈরি করা হয়েছে - অর্থাৎ এটি গ্রেগরিয়ান ক্যালেন্ডারটিকে বছর 1-এ প্রসারিত করে 000 সোমবার। Ticks1 লা জানুয়ারী 0001 থেকে 100-ন্যানোসেকেন্ডের বর্ধনের সংখ্যা। একদিনে আমরা লিখতে পারি 86,400 সেকেন্ড রয়েছে তা দেওয়া হচ্ছে:var thursday = date.AddDays(3 - date.Ticks / 86400 / 10_000_000 % 7); return (thursday.DayOfYear - 1) / 7 + 1;
অ্যাড্রিয়ান এস

5

.NET 3.0 এ এবং পরে আপনি -Modod ব্যবহার করতে পারেনISOWeek.GetWeekOfDate

মনে রাখবেন যে বছরের + সপ্তাহের সংখ্যা বিন্যাসটি DateTimeবছরের সীমানাটি অতিক্রম করে এমন সপ্তাহের কারণে বছরের চেয়ে আলাদা হতে পারে ।


3

সি # থেকে ইল_গুরু থেকে উপরের কোড থেকে পাওয়ারশেল বন্দরে :

function GetWeekOfYear([datetime] $inputDate)
{
   $day = [System.Globalization.CultureInfo]::InvariantCulture.Calendar.GetDayOfWeek($inputDate)
   if (($day -ge [System.DayOfWeek]::Monday) -and ($day -le [System.DayOfWeek]::Wednesday))
   {
      $inputDate = $inputDate.AddDays(3)
   }

   # Return the week of our adjusted day
   $weekofYear = [System.Globalization.CultureInfo]::InvariantCulture.Calendar.GetWeekOfYear($inputDate, [System.Globalization.CalendarWeekRule]::FirstFourDayWeek, [System.DayOfWeek]::Monday)
   return $weekofYear
}

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

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

যদি আপনি এটি করেন তবে আপনার উত্তরের মূল লেখককে ক্রেডিট করা উচিত। আপনি যে উত্তরটি রেখেছেন সেটিতে আরও ভাল মন্তব্য রয়েছে যা আপনি সম্ভবত মুছে ফেলেছেন। এছাড়াও, প্রশ্নটি পাওয়ারশেলের উল্লেখ না করায় এটি প্রশ্নের উত্তর নয়।
ওয়াই হা লি

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

2

সি # এবং ডেটটাইম ক্লাস ব্যবহার করে সপ্তাহের সংখ্যা আইএসও 8601 শৈলী নির্ধারণের সবচেয়ে সহজ উপায়।

এটি জিজ্ঞাসা করুন: বছরের কত বৃহত্তর বৃহস্পতিবার এই সপ্তাহের বৃহস্পতিবার। উত্তরটি চেয়েছিল সপ্তাহের সংখ্যাটির সমান।

var dayOfWeek = (int)moment.DayOfWeek;
// Make monday the first day of the week
if (--dayOfWeek < 0)
    dayOfWeek = 6;
// The whole nr of weeks before this thursday plus one is the week number
var weekNumber = (moment.AddDays(3 - dayOfWeek).DayOfYear - 1) / 7 + 1;

1
var cultureInfo = CultureInfo.CurrentCulture;
var calendar = cultureInfo.Calendar;

var calendarWeekRule = cultureInfo.DateTimeFormat.CalendarWeekRule;
var firstDayOfWeek = cultureInfo.DateTimeFormat.FirstDayOfWeek;
var lastDayOfWeek = cultureInfo.LCID == 1033 //En-us
                    ? DayOfWeek.Saturday
                    : DayOfWeek.Sunday;

var lastDayOfYear = new DateTime(date.Year, 12, 31);

var weekNumber = calendar.GetWeekOfYear(date, calendarWeekRule, firstDayOfWeek);

 //Check if this is the last week in the year and it doesn`t occupy the whole week
return weekNumber == 53 && lastDayOfYear.DayOfWeek != lastDayOfWeek 
       ? 1  
       : weekNumber;

এটি মার্কিন যুক্তরাষ্ট্র এবং রাশিয়ান উভয় সংস্কৃতির জন্য ভাল কাজ করে। আইএসও 8601 এছাড়াও সঠিক হবে, কারণ রাশিয়ান সপ্তাহ সোমবার থেকে শুরু হয়।


1

এখানে একটি এক্সটেনশন সংস্করণ এবং il_guru এর উত্তরের নাল সংস্করণ is

এক্সটেনশান:

public static int GetIso8601WeekOfYear(this DateTime time)
{
    var day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

Nullable:

public static int? GetIso8601WeekOfYear(this DateTime? time)
{
    return time?.GetIso8601WeekOfYear();
}

রীতিনীতি:

new DateTime(2019, 03, 15).GetIso8601WeekOfYear(); //returns 11
((DateTime?) new DateTime(2019, 03, 15)).GetIso8601WeekOfYear(); //returns 11
((DateTime?) null).GetIso8601WeekOfYear(); //returns null

0

প্রশ্নটি হ'ল: যদি সপ্তাহটি 2012 বা 2013 এ থাকে তবে আপনি কীভাবে সংজ্ঞা দেবেন? আপনার অনুমান, আমার ধারণা, যেহেতু সপ্তাহের 6 দিন 2013 এ, তাই এই সপ্তাহটি 2013 সালের প্রথম সপ্তাহ হিসাবে চিহ্নিত করা উচিত।

নিশ্চিত না যে এটি যাওয়ার সঠিক উপায় কিনা। সেই সপ্তাহটি ২০১২ সালে (সোমবার ৩১ শে ডিসেম্বর) শুরু হয়েছিল, সুতরাং এটি ২০১২ সালের শেষ সপ্তাহ হিসাবে চিহ্নিত করা উচিত, সুতরাং এটি ২০১২ সালের ৫৩ তম হওয়া উচিত। ২০১৩ সালের প্রথম সপ্তাহে সোমবারে 7th ই নভেম্বর শুরু হওয়া উচিত।

এখন, আপনি সপ্তাহের তথ্যটি ব্যবহার করে প্রান্ত সপ্তাহের (বছরের প্রথম এবং শেষ সপ্তাহ) নির্দিষ্ট ক্ষেত্রে পরিচালনা করতে পারেন। এটি সব আপনার যুক্তির উপর নির্ভর করে।


ঠিক আছে, আমি আপনার পয়েন্ট দেখতে পারি। জিনিসটি যখন আমি আমার যে কোনও পদ্ধতিতে 2013/01/07 ব্যবহার করি, এটি সপ্তাহ 2 বলে So 2013. কিন্তু আমি যখন 2013/01/01 চেষ্টা এটা বলে সপ্তাহে 1.
Amberlamps

0
  DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
  DateTime date1 = new DateTime(2011, 1, 1);
  Calendar cal = dfi.Calendar;

  Console.WriteLine("{0:d}: Week {1} ({2})", date1, 
                    cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, 
                                      dfi.FirstDayOfWeek),
                    cal.ToString().Substring(cal.ToString().LastIndexOf(".") + 1));      

0

Il_guru এর উত্তরের ভিত্তিতে, আমি আমার নিজের প্রয়োজনের জন্য এই সংস্করণটি তৈরি করেছি যা বছরের উপাদানটিও ফেরত দেয়।

    /// <summary>
    /// This presumes that weeks start with Monday.
    /// Week 1 is the 1st week of the year with a Thursday in it.
    /// </summary>
    /// <param name="time">The date to calculate the weeknumber for.</param>
    /// <returns>The year and weeknumber</returns>
    /// <remarks>
    /// Based on Stack Overflow Answer: https://stackoverflow.com/a/11155102
    /// </remarks>
    public static (short year, byte week) GetIso8601WeekOfYear(DateTime time)
    {
        // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll
        // be the same week# as whatever Thursday, Friday or Saturday are,
        // and we always get those right
        DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
        if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
        {
            time = time.AddDays(3);
        }
        // Return the week of our adjusted day
        var week = (byte)CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
        return ((short)(week >= 52 & time.Month == 1 ? time.Year - 1 : time.Year), week);
    }

0

এই দুটি পদ্ধতি সাহায্য করবে, ধরে নিচ্ছি আমাদের সপ্তাহটি সোমবার থেকে শুরু হচ্ছে

/// <summary>
    /// Returns the weekId
    /// </summary>
    /// <param name="DateTimeReference"></param>
    /// <returns>Returns the current week id</returns>
    public static DateTime GetDateFromWeek(int WeekReference)
    {
        //365 leap
        int DaysOffset = 0;
        if (WeekReference > 1)
        {
            DaysOffset = 7;
            WeekReference = WeekReference - 1;
        }
        DateTime DT = new DateTime(DateTime.Now.Year, 1, 1);
        int CurrentYear = DT.Year;
        DateTime SelectedDateTime = DateTime.MinValue;

        while (CurrentYear == DT.Year)
        {
            int TheWeek = WeekReportData.GetWeekId(DT);
            if (TheWeek == WeekReference)
            {
                SelectedDateTime = DT;
                break;
            }
            DT = DT.AddDays(1.0D);
        }

        if (SelectedDateTime == DateTime.MinValue)
        {
            throw new Exception("Please check week");
        }

        return SelectedDateTime.AddDays(DaysOffset);
    }
/// <summary>
    /// Returns the weekId
    /// </summary>
    /// <param name="DateTimeReference"></param>
    /// <returns>Returns the current week id</returns>
    public static int GetWeekId(DateTime DateTimeReference)
    {
        CultureInfo ciCurr = CultureInfo.InvariantCulture;
        int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTimeReference,
        CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday);
        return weekNum;
    }

-1

একটি বছরের 52 বছর এবং 1 দিন বা 2 একটি ল্যাপ বছরের ক্ষেত্রে (52 x 7 = 364)। ২০১২-১২-৩১ হ'ল 53 সপ্তাহ, এক সপ্তাহে কেবল 2 দিন সময় লাগবে কারণ 2012 একটি ল্যাপ বছর।


এটি ভুল। বছরের সপ্তাহের প্রথম দিনটি সপ্তাহের যে কোনও দিনে পড়তে পারে, আপনি কীভাবে সপ্তাহগুলি গণনা করেন তার উপর নির্ভর করে বছরের একটি 54 তম সপ্তাহ থাকতে পারে।
kroe2

-2
public int GetWeekNumber()
{
   CultureInfo ciCurr = CultureInfo.CurrentCulture;
   int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTime.Now, 
   CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
   return weekNum;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.