আমি কিভাবে আগামী মঙ্গলবার তারিখ পেতে পারি?
পিএইচপি-তে এটি যতটা সহজ strtotime('next tuesday');
।
কীভাবে। নেট এ অনুরূপ কিছু অর্জন করতে পারি
আমি কিভাবে আগামী মঙ্গলবার তারিখ পেতে পারি?
পিএইচপি-তে এটি যতটা সহজ strtotime('next tuesday');
।
কীভাবে। নেট এ অনুরূপ কিছু অর্জন করতে পারি
উত্তর:
আমি মন্তব্যে যেমন উল্লেখ করেছি, "পরের মঙ্গলবার" বলতে আপনি বোঝাতে পারেন এমন বিভিন্ন জিনিস রয়েছে তবে এই কোডটি আপনাকে "পরবর্তী মঙ্গলবার ঘটতে বা আজ ইতিমধ্যে মঙ্গলবার হলে" দেয়:
DateTime today = DateTime.Today;
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysUntilTuesday = ((int) DayOfWeek.Tuesday - (int) today.DayOfWeek + 7) % 7;
DateTime nextTuesday = today.AddDays(daysUntilTuesday);
ইতিমধ্যে মঙ্গলবার যদি আপনি "এক সপ্তাহের সময়" দিতে চান তবে আপনি এটি ব্যবহার করতে পারেন:
// This finds the next Monday (or today if it's Monday) and then adds a day... so the
// result is in the range [1-7]
int daysUntilTuesday = (((int) DayOfWeek.Monday - (int) today.DayOfWeek + 7) % 7) + 1;
... বা আপনি আসল সূত্রটি ব্যবহার করতে পারেন তবে আগামীকাল থেকে:
DateTime tomorrow = DateTime.Today.AddDays(1);
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysUntilTuesday = ((int) DayOfWeek.Tuesday - (int) tomorrow.DayOfWeek + 7) % 7;
DateTime nextTuesday = tomorrow.AddDays(daysUntilTuesday);
সম্পাদনা: কেবল এই সুন্দর এবং বহুমুখী করতে:
public static DateTime GetNextWeekday(DateTime start, DayOfWeek day)
{
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysToAdd = ((int) day - (int) start.DayOfWeek + 7) % 7;
return start.AddDays(daysToAdd);
}
সুতরাং "আজ বা পরবর্তী 6 দিনের মধ্যে" এর মান পেতে:
DateTime nextTuesday = GetNextWeekday(DateTime.Today, DayOfWeek.Tuesday);
"আজ বাদে আগামী মঙ্গলবার" এর মান পেতে:
DateTime nextTuesday = GetNextWeekday(DateTime.Today.AddDays(1), DayOfWeek.Tuesday);
+7)%7
সমাধান যদিও প্রশংসনীয় সুন্দর। যদিও আমি এটি ব্যবহার না করেছিলাম কারণ এটি কিছুটা মাইক্রো-অপটিমাইজেশন এবং খুব সহজেই ভুল হতে পারে (পাশাপাশি কিছু পাঠযোগ্যতার ত্যাগও করা হচ্ছে), অবশ্যই।
এই কৌতুক করতে হবে:
static DateTime GetNextWeekday(DayOfWeek day)
{
DateTime result = DateTime.Now.AddDays(1);
while( result.DayOfWeek != day )
result = result.AddDays(1);
return result;
}
.AddDays(1)
প্রথম লাইনটি থেকে সরিয়ে দিন , সেভাবে এটি নিজেও পরীক্ষা DateTime.Now
করে দেখবে ।
এই সমস্যাটির জন্য কম ভার্বোস এবং আরও চতুর / মার্জিত সমাধান রয়েছে তবে নিম্নলিখিত সি # ফাংশনটি বেশ কয়েকটি পরিস্থিতির জন্য সত্যই কার্যকরভাবে কাজ করে।
/// <summary>
/// Find the closest weekday to the given date
/// </summary>
/// <param name="includeStartDate">if the supplied date is on the specified day of the week, return that date or continue to the next date</param>
/// <param name="searchForward">search forward or backward from the supplied date. if a null parameter is given, the closest weekday (ie in either direction) is returned</param>
public static DateTime ClosestWeekDay(this DateTime date, DayOfWeek weekday, bool includeStartDate = true, bool? searchForward=true)
{
if (!searchForward.HasValue && !includeStartDate)
{
throw new ArgumentException("if searching in both directions, start date must be a valid result");
}
var day = date.DayOfWeek;
int add = ((int)weekday - (int)day);
if (searchForward.HasValue)
{
if (add < 0 && searchForward.Value)
{
add += 7;
}
else if (add > 0 && !searchForward.Value)
{
add -= 7;
}
else if (add == 0 && !includeStartDate)
{
add = searchForward.Value ? 7 : -7;
}
}
else if (add < -3)
{
add += 7;
}
else if (add > 3)
{
add -= 7;
}
return date.AddDays(add);
}
@ জোন স্কিট ভাল উত্তর।
আগের দিনের জন্য:
private DateTime GetPrevWeekday(DateTime start, DayOfWeek day) {
// The (... - 7) % 7 ensures we end up with a value in the range [0, 6]
int daysToRemove = ((int) day - (int) start.DayOfWeek - 7) % 7;
return start.AddDays(daysToRemove);
}
ধন্যবাদ !!
DayOfWeek
মতো মানগুলি অদলবদল করতে পারে :int daysToSubtract = -(((int)dateTime.DayOfWeek - (int)day + 7) % 7);
বর্তমান তারিখটি অন্তর্ভুক্ত বা বাদ দেওয়ার জন্য খুব সাধারণ নমুনা, আপনি যে সপ্তাহে আগ্রহী সেটির তারিখ এবং দিনটি নির্দিষ্ট করেন।
public static class DateTimeExtensions
{
/// <summary>
/// Gets the next date.
/// </summary>
/// <param name="date">The date to inspected.</param>
/// <param name="dayOfWeek">The day of week you want to get.</param>
/// <param name="exclDate">if set to <c>true</c> the current date will be excluded and include next occurrence.</param>
/// <returns></returns>
public static DateTime GetNextDate(this DateTime date, DayOfWeek dayOfWeek, bool exclDate = true)
{
//note: first we need to check if the date wants to move back by date - Today, + diff might move it forward or backwards to Today
//eg: date - Today = 0 - 1 = -1, so have to move it forward
var diff = dayOfWeek - date.DayOfWeek;
var ddiff = date.Date.Subtract(DateTime.Today).Days + diff;
//note: ddiff < 0 : date calculates to past, so move forward, even if the date is really old, it will just move 7 days from date passed in
//note: ddiff >= (exclDate ? 6 : 7) && diff < 0 : date is into the future, so calculated future weekday, based on date
if (ddiff < 0 || ddiff >= (exclDate ? 6 : 7) && diff < 0)
diff += 7;
//note: now we can get safe values between 0 - 6, especially if past dates is being used
diff = diff % 7;
//note: if diff is 0 and we are excluding the date passed, we will add 7 days, eg: 1 week
diff += diff == 0 & exclDate ? 7 : 0;
return date.AddDays(diff);
}
}
কিছু পরীক্ষার ক্ষেত্রে
[TestMethod]
public void TestNextDate()
{
var date = new DateTime(2013, 7, 15);
var start = date;
//testing same month - forwardOnly
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Tuesday)); //16
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Wednesday)); //17
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Thursday)); //18
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Friday)); //19
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Saturday)); //20
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Sunday)); //21
Assert.AreEqual(start.AddDays(1), date.GetNextDate(DayOfWeek.Monday)); //22
//testing same month - include date
Assert.AreEqual(start = date, date.GetNextDate(DayOfWeek.Monday, false)); //15
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Tuesday, false)); //16
Assert.AreEqual(start.AddDays(1), date.GetNextDate(DayOfWeek.Wednesday, false)); //17
//testing month change - forwardOnly
date = new DateTime(2013, 7, 29);
start = date;
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Tuesday)); //30
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Wednesday)); //31
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Thursday)); //2013/09/01-month increased
Assert.AreEqual(start.AddDays(1), date.GetNextDate(DayOfWeek.Friday)); //02
//testing year change
date = new DateTime(2013, 12, 30);
start = date;
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Tuesday)); //31
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Wednesday)); //2014/01/01 - year increased
Assert.AreEqual(start = start.AddDays(1), date.GetNextDate(DayOfWeek.Thursday)); //02
}
এটি একটি এক্সটেনশনও হতে পারে, এটি সব নির্ভর করে
public static class DateTimeExtensions
{
public static IEnumerable<DateTime> Next(this DateTime date, DayOfWeek day)
{
// This loop feels expensive and useless, but the point is IEnumerable
while(true)
{
if (date.DayOfWeek == day)
{
yield return date;
}
date = date.AddDays(1);
}
}
}
ব্যবহার
var today = DateTime.Today;
foreach(var monday in today.Next(DayOfWeek.Monday))
{
Console.WriteLine(monday);
Console.ReadKey();
}
এখন অনেলিয়ার স্বাদে - যদি আপনাকে কোনও ব্যবস্থায় প্যারামিটার হিসাবে পাস করতে হয় তবে।
DateTime.Now.AddDays(((int)yourDate.DayOfWeek - (int)DateTime.Now.DayOfWeek + 7) % 7).Day
এই নির্দিষ্ট ক্ষেত্রে:
DateTime.Now.AddDays(((int)DayOfWeek.Tuesday - (int)DateTime.Now.DayOfWeek + 7) % 7).Day
উদ্দেশ্য সি সংস্করণ:
+(NSInteger) daysUntilNextWeekday: (NSDate*)startDate withTargetWeekday: (NSInteger) targetWeekday
{
NSInteger startWeekday = [[NSCalendar currentCalendar] component:NSCalendarUnitWeekday fromDate:startDate];
return (targetWeekday - startWeekday + 7) % 7;
}