.NET库是否可以简单地返回给定日期的星期数?例如,输入Year = 2010, Month = 1, Day = 25
,应输出5
为周数。使用.NET计算一个月中的第几周
最近我发现是Calendar.GetWeekOfYear
,这几乎就在那里。
Java有一个日期字符串格式“W”,它在一个月内返回一周,但我在.NET中看不到任何等同的东西。
.NET库是否可以简单地返回给定日期的星期数?例如,输入Year = 2010, Month = 1, Day = 25
,应输出5
为周数。使用.NET计算一个月中的第几周
最近我发现是Calendar.GetWeekOfYear
,这几乎就在那里。
Java有一个日期字符串格式“W”,它在一个月内返回一周,但我在.NET中看不到任何等同的东西。
没有内置的方式来做到这一点,但这里是一个扩展方法,它应该为你做的工作:
static class DateTimeExtensions {
static GregorianCalendar _gc = new GregorianCalendar();
public static int GetWeekOfMonth(this DateTime time) {
DateTime first = new DateTime(time.Year, time.Month, 1);
return time.GetWeekOfYear() - first.GetWeekOfYear() + 1;
}
static int GetWeekOfYear(this DateTime time) {
return _gc.GetWeekOfYear(time, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
}
}
用法:
DateTime time = new DateTime(2010, 1, 25);
Console.WriteLine(time.GetWeekOfMonth());
输出:
5
您可以根据自己的需要更改GetWeekOfYear
。
,那么具体:http://forums.asp.net/t/1268112.aspx
你可以使用:
public static int Iso8601WeekNumber(DateTime dt)
{
return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
public static int GetWeekOfMonth(DateTime dt)
{
int weekOfYear = Iso8601WeekNumber(dt);
if (dt.Month == 1)
{
//week of year == week of month in January
//this also fixes the overflowing last December week
return weekOfYear;
}
int weekOfYearAtFirst = Iso8601WeekNumber(dt.AddDays(1 - dt.Day));
return weekOfYear - weekOfYearAtFirst + 1;
}
注意认为,由于有一定的算法选择,您的需求可能会有所不同。即是一周的星期一到星期五是二月底还是三月的第一周,或者什么标准定义了一个月的“第一个”星期? ISO 8601:2004未给出“每周”的定义。
没有直接的内置方式来做到这一点,但它可以很容易地完成。这是一个扩展方法,它可以用来轻松获得日期的年份为基础的周数:
public static int GetWeekNumber(this DateTime date)
{
return GetWeekNumber(date, CultureInfo.CurrentCulture);
}
public static int GetWeekNumber(this DateTime date, CultureInfo culture)
{
return culture.Calendar.GetWeekOfYear(date,
culture.DateTimeFormat.CalendarWeekRule,
culture.DateTimeFormat.FirstDayOfWeek);
}
然后,我们可以用它来计算月为周数,有点像Jason shows。一个文化友好的版本可能看起来像这样:
public static int GetWeekNumberOfMonth(this DateTime date)
{
return GetWeekNumberOfMonth(date, CultureInfo.CurrentCulture);
}
public static int GetWeekNumberOfMonth(this DateTime date, CultureInfo culture)
{
return date.GetWeekNumber(culture)
- new DateTime(date.Year, date.Month, 1).GetWeekNumber(culture)
+ 1; // Or skip +1 if you want the first week to be 0.
}
+ 1对文化友善 – eddiegroves 2010-01-26 21:14:12
@eddiegroves:谢谢。至少有人赞赏它:p – Svish 2010-01-26 21:49:26
这是一个古老的线程,但我需要这样的事情,这就是我想出的。
public static int WeekOfMonth(this DateTime date)
{
DateTime firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
int firstDay = (int)firstDayOfMonth.DayOfWeek;
if (firstDay == 0)
{
firstDay = 7;
}
double d = (firstDay + date.Day - 1)/7.0;
return (int)Math.Ceiling(d);
}
注意:如果您想使用星期一作为一周的第一天,这应该有效。如果你想让这个星期在星期天开始,那么在2015年3月的第二个星期以及其他日期可能会失败。 2015年3月9日星期一是第二周的第一天。上述计算在该日期返回“3”。
public int WeekCalc(DateTime dt)
{
CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;
}
@Svish
VB版:
Public Shared Function GetWeekNumber(ByVal [date] As DateTime) As Integer
Return GetWeekNumber([date], CultureInfo.CurrentCulture)
End Function
Public Shared Function GetWeekNumber(ByVal [date] As DateTime, ByVal culture As CultureInfo) As Integer
Return culture.Calendar.GetWeekOfYear([date], culture.DateTimeFormat.CalendarWeekRule, culture.DateTimeFormat.FirstDayOfWeek)
End Function
Public Shared Function GetWeekNumberOfMonth(ByVal [date] As DateTime) As Integer
Return GetWeekNumberOfMonth([date], CultureInfo.CurrentCulture)
End Function
Public Shared Function GetWeekNumberOfMonth(ByVal [date] As DateTime, ByVal culture As CultureInfo) As Integer
Return GetWeekNumber([date], culture) - GetWeekNumber(New DateTime([date].Year, [date].Month, 1), culture) + 1
' Or skip +1 if you want the first week to be 0.
End Function
一旦你有一个月的第一天的星期几,你可以使用整数运算得到一个月的一周。
static class DateTimeExtensions
{
// Assumes that in current culture week starts on Sunday
public static int GetWeekOfMonth(this DateTimeOffset time)
{
DateTimeOffset first = new DateTimeOffset(time.Year, time.Month, 1, 0, 0, 0, time.Offset);
int firstSunday = (7 - (int)first.DayOfWeek) % 7 + 1;
int weekOfMonth = 1 + (time.Day + 7 - firstSunday)/7;
return weekOfMonth;
}
}
一些简单的...:)
private int WeeksNumber()
{
int daysInMonth = DateTime.DaysInMonth(YourYear, YourMonth);
DateTime date = new DateTime(Year, Month, 1);
switch (daysInMonth)
{
case 28:
{
if (date.DayOfWeek == DayOfWeek.Monday)
{
return 4;
}
else
{
return 5;
}
}
case 29:
{
return 5;
}
case 30:
{
if (date.DayOfWeek == DayOfWeek.Sunday)
{
return 6;
}
else
{
return 5;
}
}
case 31:
{
if (date.DayOfWeek == DayOfWeek.Sunday || date.DayOfWeek == DayOfWeek.Saturday)
{
return 6;
}
else
{
return 5;
}
}
default: return 5;
}
}
标题是误导。问题实际上是关于月份的日历周编号(如果您计算日历中的行的周数),而不是实际的周数。
月内的周数,你可以使用:
VB:
Function WeekNumber(TargetDate As Date) As Integer
Return (TargetDate.Day - 1) \ 7 + 1
End Function
C#:
public int WeekNumber(DateTime TargetDate)
{
return (TargetDate.Day - 1)/7 + 1;
}
我同意这个标题是误导性的。例如,我试图计算本月的第四个星期一。但是,当我使用此问题提供的其他答案编写单元测试时,其中一些结果与我预期的不符。这是因为如果一个月的第一天是星期二或以后的一周,结果会关闭一周。这个答案提供的代码是我最终用来解决问题的。 – user3308241 2015-01-23 05:35:17
这不符合这个例子。 2010年1月1日是星期五,所以第一个日历周只有两天。因此,第25周通常会在第4周使用这个公式计算,实际上是在第5周。由于该例说2010年1月1日应该产生第5周,所以这个答案中的公式不可能是正确的,因为它产生第4周(即(int((25-1)/ 7)+1)= 4. – Triynko 2016-02-18 04:31:49
这是我的解决方案:
static string GetWeekNumber()
{
var weekNumber = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Sunday) -
CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now.AddDays(1 - DateTime.Now.Day),
CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday) + 1;
switch (weekNumber)
{
case 1 :
return "First";
case 2:
return "Second";
case 3:
return "Third";
default:
return "Fourth";
}
}
你知道每个月可能有6周吗? – 2016-06-09 21:09:16
这里有一个简单的选择,如果你想第7天被认为是第一周,即使一个月不上周日开始:
class Program
{
static void Main(string[] args)
{
var dates = Enumerable.Range(0, 10)
.Select(r => new DateTime(2015, 10, 1).AddDays(r))
.Select(q => new { Date = q, WeekOfMonth = q.WeekOfMonth() });
foreach(var item in dates)
{
Console.WriteLine("Date: {0:ddd MM-dd-yyyy}, WOM: {1}", item.Date, item.WeekOfMonth);
}
var final = Console.ReadLine();
}
}
public static class DateTimeExtensions
{
public static int WeekOfMonth(this DateTime d)
{
var isExact = (d.Day % 7 == 0);
var offset = isExact ? 0 : 1;
return (int)Math.Floor(d.Day/7.0) + offset;
}
}
Dim mdt As Date = txtDT.Text
Dim weekNum As Integer = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(mdt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday) - CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(GetFirstDayOfMonth(mdt), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday) + 1
Response.Write(weekNum)
这是不正确的;它会为'dt = new DateTime(2010,1,25)'返回'-48'。 – jason 2010-01-26 00:21:07
@Jason很好。问题在于一月的第一天属于十二月的最后一周。修复了忽略该代码的代码。 – GaussZ 2010-01-26 07:53:09