C # 'daki geçerli saati bilerek haftanın başlangıcını (Pazar ve Pazartesi) nasıl bulabilirim?
Gibi bir şey:
DateTime.Now.StartWeek(Monday);
C # 'daki geçerli saati bilerek haftanın başlangıcını (Pazar ve Pazartesi) nasıl bulabilirim?
Gibi bir şey:
DateTime.Now.StartWeek(Monday);
Yanıtlar:
Bir uzantı yöntemi kullanın. Onlar her şeyin cevabı, biliyorsun! ;)
public static class DateTimeExtensions
{
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
return dt.AddDays(-1 * diff).Date;
}
}
Hangi aşağıdaki gibi kullanılabilir:
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
dt
UTC ve şimdiden hafta ör başlangıcıdır 2012-09-02 16:00:00Z
olan Mon, 03 Sep 2012 00:00:00
yerel saatte. Bu yüzden dt
yerel saate dönüşmeli veya biraz daha akıllıca bir şey yapmalı. Giriş UTC ise sonucu UTC olarak döndürmek de gerekir.
DateTime.Parse("2012-09-02 16:00:00Z")
, yerel saat eşdeğerini döndürür ve bu yöntem, yerel saatle aynı saati doğru şekilde döndürür. DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()
UTC saatini açıkça iletmek için kullanırsanız , bu yöntem 6 gün 16 saat önce UTC saati olarak doğru bir şekilde döndürür. Tam beklediğim gibi çalışıyor.
dt
. Kullandımint diff = dt.Date.DayOfWeek - startOfWeek;
Gelebileceğim en hızlı yol:
var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek);
Haftanın başka bir gününün başlangıç tarihiniz olmasını istiyorsanız, yapmanız gereken tek şey DayOfWeek değerini sonuna eklemek.
var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Monday);
var tuesday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Tuesday);
Biraz daha ayrıntılı ve kültüre duyarlı:
System.Globalization.CultureInfo ci =
System.Threading.Thread.CurrentThread.CurrentCulture;
DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
DayOfWeek today = DateTime.Now.DayOfWeek;
DateTime sow = DateTime.Now.AddDays(-(today - fdow)).Date;
CultureInfo.CurrentCulture
böyle bir iplikten çıkarmak yerine kullanarak da alabilirsiniz . Erişmek için garip bir yol gibi görünüyor.
Now
Mülkü iki kez aramak tehlikelidir . Geçerli saat, iki arama arasında 24:00 (veya gece yarısı 12:00) geçerse, tarih değişmiş olacaktır.
Akıcı DateTime kullanma :
var monday = DateTime.Now.Previous(DayOfWeek.Monday);
var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);
public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
Çirkin ama en azından doğru tarihleri geri veriyor
Sistem tarafından ayarlanan haftanın başlangıcı ile:
public static DateTime FirstDateInWeek(this DateTime dt)
{
while (dt.DayOfWeek != System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
dt = dt.AddDays(-1);
return dt;
}
olmadan:
public static DateTime FirstDateInWeek(this DateTime dt, DayOfWeek weekStartDay)
{
while (dt.DayOfWeek != weekStartDay)
dt = dt.AddDays(-1);
return dt;
}
Kültüre güvenli cevabı ve uzatma yöntemi cevabını birleştirelim:
public static class DateTimeExtensions
{
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
return DateTime.Today.AddDays(-(DateTime.Today.DayOfWeek- fdow));
}
}
dt
yerine , geçerli kültürün argüman olarak geçen tek parametreli bir aşırı yükleme yöntemi kullanmak ve muhtemelen (spesifikasyona bağlı olarak) bir sıfır ofset 7 günlük ofset, böylece "geçen Salı" zaten Salı ise bugün dönmez. DateTime.Today
(offset + 7) % 7
FirstDayOfWeek
startOfWeek
Bu biraz hack olabilir, ancak .DayOfWeek özelliğini bir int'e atayabilirsiniz (bir enumdur ve temel veri türü değişmediğinden varsayılan olarak int olarak değiştirilmiştir) ve bunu haftanın önceki başlangıcını belirlemek için kullanabilirsiniz .
DayOfWeek enum'da belirtilen hafta Pazar günü başlar, bu nedenle bu değerden 1 çıkarırsak, Pazartesi gününün geçerli tarihten önceki gün sayısına eşit olur. Ayrıca Pazar gününü (0) 7'ye eşitlememiz gerekir, böylece 1 - 7 = -6 Pazar günü bir önceki Pazartesi günü eşleşir: -
DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek;
DateTime startOfWeek = now.AddDays(1 - (int)now.DayOfWeek);
Bu ayarlamayı yapmak zorunda olmadığımız için önceki Pazar'ın kodu daha basit: -
DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
DateTime startOfWeek = now.AddDays(-(int)now.DayOfWeek);
Pazartesi için
DateTime startAtMonday = DateTime.Now.AddDays(DayOfWeek.Monday - DateTime.Now.DayOfWeek);
Pazar için
DateTime startAtSunday = DateTime.Now.AddDays(DayOfWeek.Sunday- DateTime.Now.DayOfWeek);
using System;
using System.Globalization;
namespace MySpace
{
public static class DateTimeExtention
{
// ToDo: Need to provide culturaly neutral versions.
public static DateTime GetStartOfWeek(this DateTime dt)
{
DateTime ndt = dt.Subtract(TimeSpan.FromDays((int)dt.DayOfWeek));
return new DateTime(ndt.Year, ndt.Month, ndt.Day, 0, 0, 0, 0);
}
public static DateTime GetEndOfWeek(this DateTime dt)
{
DateTime ndt = dt.GetStartOfWeek().AddDays(6);
return new DateTime(ndt.Year, ndt.Month, ndt.Day, 23, 59, 59, 999);
}
public static DateTime GetStartOfWeek(this DateTime dt, int year, int week)
{
DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
return dayInWeek.GetStartOfWeek();
}
public static DateTime GetEndOfWeek(this DateTime dt, int year, int week)
{
DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
return dayInWeek.GetEndOfWeek();
}
}
}
Hepsini Küreselleşme ile bir araya getirmek ve haftanın ilk gününü yaptığımız görüşmenin bir parçası olarak belirtmek için izin vermek
public static DateTime StartOfWeek ( this DateTime dt, DayOfWeek? firstDayOfWeek )
{
DayOfWeek fdow;
if ( firstDayOfWeek.HasValue )
{
fdow = firstDayOfWeek.Value;
}
else
{
System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
fdow = ci.DateTimeFormat.FirstDayOfWeek;
}
int diff = dt.DayOfWeek - fdow;
if ( diff < 0 )
{
diff += 7;
}
return dt.AddDays( -1 * diff ).Date;
}
var now = System.DateTime.Now;
var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date;
Bu size haftanın ilk Pazar günü gece yarısı verir:
DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, t.Hour, t.Minute, t.Second);
Bu, gece yarısında ilk Pazartesi günü verir:
DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek - 1, t.Hour, t.Minute, t.Second);
c # ile bunu deneyin.Bu kod ile belirli bir haftanın hem ilk tarihini hem de son tarihini alabilirsiniz.
DateTime firstDate = GetFirstDateOfWeek(DateTime.Parse("05/09/2012").Date,DayOfWeek.Sunday);
DateTime lastDate = GetLastDateOfWeek(DateTime.Parse("05/09/2012").Date, DayOfWeek.Saturday);
public static DateTime GetFirstDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
DateTime firstDayInWeek = dayInWeek.Date;
while (firstDayInWeek.DayOfWeek != firstDay)
firstDayInWeek = firstDayInWeek.AddDays(-1);
return firstDayInWeek;
}
public static DateTime GetLastDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
DateTime lastDayInWeek = dayInWeek.Date;
while (lastDayInWeek.DayOfWeek != firstDay)
lastDayInWeek = lastDayInWeek.AddDays(1);
return lastDayInWeek;
}
Birkaç denedim ama bir Pazartesi günü başlayan bir hafta ile sorunu çözmedi, bana bir Pazar günü önümüzdeki Pazartesi vermekle sonuçlanan. Bu yüzden biraz değiştirdim ve bu kod ile çalışma var:
int delta = DayOfWeek.Monday - DateTime.Now.DayOfWeek;
DateTime monday = DateTime.Now.AddDays(delta == 1 ? -6 : delta);
return monday;
dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Adım 1: Statik bir sınıf oluşturma
public static class TIMEE
{
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
return dt.AddDays(-1 * diff).Date;
}
public static DateTime EndOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
int diff = (7 - (dt.DayOfWeek - startOfWeek)) % 7;
return dt.AddDays(1 * diff).Date;
}
}
Adım 2: Haftanın hem başlangıç hem de bitiş gününü almak için bu sınıfı kullanın
DateTime dt =TIMEE.StartOfWeek(DateTime.Now ,DayOfWeek.Monday);
DateTime dt1 = TIMEE.EndOfWeek(DateTime.Now, DayOfWeek.Sunday);
(6 - (dt.DayOfWeek - startOfWeek)) % 7
yazdığım birim sınavlara karşı benim için gerekli .
Aşağıdaki yöntem, istediğiniz DateTime döndürmelidir. Pazar gününün haftanın ilk günü olması için doğru, Pazartesi için yanlış:
private DateTime getStartOfWeek(bool useSunday)
{
DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
if(!useSunday)
dayOfWeek--;
if(dayOfWeek < 0)
{// day of week is Sunday and we want to use Monday as the start of the week
// Sunday is now the seventh day of the week
dayOfWeek = 6;
}
return now.AddDays(-1 * (double)dayOfWeek);
}
Örnekler için teşekkürler. Her zaman "CurrentCulture" haftanın ilk günü kullanmak gerekiyordu ve bir dizi için tam Daynumber bilmek gerekiyordu .. işte benim ilk uzantıları:
public static class DateTimeExtensions
{
//http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week
//http://stackoverflow.com/questions/1788508/calculate-date-with-monday-as-dayofweek1
public static DateTime StartOfWeek(this DateTime dt)
{
//difference in days
int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.
//As a result we need to have day 0,1,2,3,4,5,6
if (diff < 0)
{
diff += 7;
}
return dt.AddDays(-1 * diff).Date;
}
public static int DayNoOfWeek(this DateTime dt)
{
//difference in days
int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.
//As a result we need to have day 0,1,2,3,4,5,6
if (diff < 0)
{
diff += 7;
}
return diff + 1; //Make it 1..7
}
}
Henüz kimse bunu doğru olarak cevaplamamış gibi görünüyor. Herkesin ihtiyaç duyması durumunda çözümümü buraya yapıştıracağım. Aşağıdaki kod, haftanın ilk gününün pazartesi veya pazar veya başka bir şey olup olmadığına bakılmaksızın çalışır.
public static class DateTimeExtension
{
public static DateTime GetFirstDayOfThisWeek(this DateTime d)
{
CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
var first = (int)ci.DateTimeFormat.FirstDayOfWeek;
var current = (int)d.DayOfWeek;
var result = first <= current ?
d.AddDays(-1 * (current - first)) :
d.AddDays(first - current - 7);
return result;
}
}
class Program
{
static void Main()
{
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine("Current culture set to en-US");
RunTests();
Console.WriteLine();
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("da-DK");
Console.WriteLine("Current culture set to da-DK");
RunTests();
Console.ReadLine();
}
static void RunTests()
{
Console.WriteLine("Today {1}: {0}", DateTime.Today.Date.GetFirstDayOfThisWeek(), DateTime.Today.Date.ToString("yyyy-MM-dd"));
Console.WriteLine("Saturday 2013-03-02: {0}", new DateTime(2013, 3, 2).GetFirstDayOfThisWeek());
Console.WriteLine("Sunday 2013-03-03: {0}", new DateTime(2013, 3, 3).GetFirstDayOfThisWeek());
Console.WriteLine("Monday 2013-03-04: {0}", new DateTime(2013, 3, 4).GetFirstDayOfThisWeek());
}
}
C # 'daki Modulo -1mod7 için kötü çalışıyor (6 olmalı, c # -1 döndürür) bu yüzden ... "oneliner" çözümü buna benzeyecek :)
private static DateTime GetFirstDayOfWeek(DateTime date)
{
return date.AddDays(-(((int)date.DayOfWeek - 1) - (int)Math.Floor((double)((int)date.DayOfWeek - 1) / 7) * 7));
}
Mükemmel Şemsiye kütüphanesini kullanabilirsiniz :
using nVentive.Umbrella.Extensions.Calendar;
DateTime beginning = DateTime.Now.BeginningOfWeek();
Ancak, do özelliği (bkz haftanın ilk günü olarak Pazartesi sakladığınız gibi görünüyornVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn
önceki lokalize çözüm biraz daha iyi olduğunu böylece,). Talihsiz.
Düzenleme : soruya daha yakından bakıldığında, Şemsiye aslında bunun için de işe yarayabilir:
// Or DateTime.Now.PreviousDay(DayOfWeek.Monday)
DateTime monday = DateTime.Now.PreviousMonday();
DateTime sunday = DateTime.Now.PreviousSunday();
Her ne kadar önceki Pazartesi günü Pazartesi günü sorarsanız, size yedi gün geri vereceğini belirtmek gerekir. Ancak bu BeginningOfWeek
bir hata gibi görünüyorsa da geçerlidir :(.
Bu, hem haftanın başlangıcı hem de haftanın sonu tarihlerini döndürür:
private string[] GetWeekRange(DateTime dateToCheck)
{
string[] result = new string[2];
TimeSpan duration = new TimeSpan(0, 0, 0, 0); //One day
DateTime dateRangeBegin = dateToCheck;
DateTime dateRangeEnd = DateTime.Today.Add(duration);
dateRangeBegin = dateToCheck.AddDays(-(int)dateToCheck.DayOfWeek);
dateRangeEnd = dateToCheck.AddDays(6 - (int)dateToCheck.DayOfWeek);
result[0] = dateRangeBegin.Date.ToString();
result[1] = dateRangeEnd.Date.ToString();
return result;
}
ZamirsBlog bloguma hafta, ay, çeyrek ve yılın başlangıç / bitişini hesaplamak için tam kodu gönderdim
namespace DateTimeExample
{
using System;
public static class DateTimeExtension
{
public static DateTime GetMonday(this DateTime time)
{
if (time.DayOfWeek != DayOfWeek.Monday)
return GetMonday(time.AddDays(-1)); //Recursive call
return time;
}
}
internal class Program
{
private static void Main()
{
Console.WriteLine(DateTime.Now.GetMonday());
Console.ReadLine();
}
}
}
İşte birkaç cevaptan oluşan bir kombinasyon. Kültürün geçmesine izin veren bir uzatma yöntemi kullanır, biri geçmezse, mevcut kültür kullanılır. Bu, ona maksimum esneklik ve yeniden kullanım sağlayacaktır.
/// <summary>
/// Gets the date of the first day of the week for the date.
/// </summary>
/// <param name="date">The date to be used</param>
/// <param name="cultureInfo">If none is provided, the current culture is used</param>
/// <returns>The date of the beggining of the week based on the culture specifed</returns>
public static DateTime StartOfWeek(this DateTime date, CultureInfo cultureInfo=null) =>
date.AddDays(-1 * (7 + (date.DayOfWeek - (cultureInfo??CultureInfo.CurrentCulture).DateTimeFormat.FirstDayOfWeek)) % 7).Date;
Örnek Kullanım:
public static void TestFirstDayOfWeekExtension() {
DateTime date = DateTime.Now;
foreach(System.Globalization.CultureInfo culture in CultureInfo.GetCultures(CultureTypes.UserCustomCulture | CultureTypes.SpecificCultures)) {
Console.WriteLine($"{culture.EnglishName}: {date.ToShortDateString()} First Day of week: {date.StartOfWeek(culture).ToShortDateString()}");
}
}
cumartesi veya pazar ya da haftanın herhangi bir gününü istiyor ancak mevcut haftayı (Sat-Sun) geçmiyorsanız, bu kod parçasını size aldım.
public static DateTime GetDateInCurrentWeek(this DateTime date, DayOfWeek day)
{
var temp = date;
var limit = (int)date.DayOfWeek;
var returnDate = DateTime.MinValue;
if (date.DayOfWeek == day) return date;
for (int i = limit; i < 6; i++)
{
temp = temp.AddDays(1);
if (day == temp.DayOfWeek)
{
returnDate = temp;
break;
}
}
if (returnDate == DateTime.MinValue)
{
for (int i = limit; i > -1; i++)
{
date = date.AddDays(-1);
if (day == date.DayOfWeek)
{
returnDate = date;
break;
}
}
}
return returnDate;
}
Derleme Bu Yanıttan Sonra, haftanın herhangi bir günü için tarih almak üzere aşağıdaki yöntemi kullanın:
public static DateTime GetDayOfWeek(this DateTime dt, DayOfWeek day)
{
int diff = (7 + (dt.DayOfWeek - DayOfWeek.Monday)) % 7;
var monday = dt.AddDays(-1 * diff).Date;
switch (day)
{
case DayOfWeek.Tuesday:
return monday.AddDays(1).Date;
case DayOfWeek.Wednesday:
return monday.AddDays(2).Date;
case DayOfWeek.Thursday:
return monday.AddDays(3).Date;
case DayOfWeek.Friday:
return monday.AddDays(4).Date;
case DayOfWeek.Saturday:
return monday.AddDays(5).Date;
case DayOfWeek.Sunday:
return monday.AddDays(6).Date;
}
return monday;
}
Özyineleme kullanan bir işlev oluşturmaya çalışın. DateTime nesneniz bir girdidir ve işlev, haftanın başında duran yeni bir DateTime nesnesi döndürür.
DateTime WeekBeginning(DateTime input)
{
do
{
if (input.DayOfWeek.ToString() == "Monday")
return input;
else
return WeekBeginning(input.AddDays(-1));
} while (input.DayOfWeek.ToString() == "Monday");
}
Bu şekilde hesaplamak, haftanın hangi gününün yeni bir haftanın başlangıcını göstereceğini seçmenize olanak tanır (örnekte Pazartesi'yi seçtim).
Bu hesaplamayı Pazartesi günü yapmak için bir önceki günü değil, geçerli Pazartesi günü yapacağınızı unutmayın.
//Replace with whatever input date you want
DateTime inputDate = DateTime.Now;
//For this example, weeks start on Monday
int startOfWeek = (int)DayOfWeek.Monday;
//Calculate the number of days it has been since the start of the week
int daysSinceStartOfWeek = ((int)inputDate.DayOfWeek + 7 - startOfWeek) % 7;
DateTime previousStartOfWeek = inputDate.AddDays(-daysSinceStartOfWeek);
int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;