C# 日期时间处理:首尾日、周数及英文月份转换

落日邮差
落日邮差
发布时间:2026-10-16 | 4人浏览过
原创

C#开发中经常需要处理复杂的日期逻辑,如获取指定月份的首尾日、判断当前是本月第几周或本年第几周,以及进行日期格式化。本文整理了一系列针对`DateTime`结构的实用代码片段,涵盖从基础信息获取到特定业务场景的时间计算。

一、获取月份的英文缩写

在某些国际化显示场景中,需要将数字月份转换为英文简写(如 "Jul")。可以通过`ToString`方法配合特定的格式字符串和区域文化信息来实现。

DateTime dt = DateTime.Now;
// 使用 en-us 区域性获取月份英文缩写
string monthAbbr = dt.AddMonths(-1).ToString("MMM", new System.Globalization.CultureInfo("en-us"));
// 示例结果: Jul (取决于当前日期所在月份)

二、计算当月第一天和最后一天

通过调整日期的天数差值,可以精准定位当月的边界。这里分别展示了获取当月首日和末日的两种简洁写法。

// 当月第一天:将当前日期减去找月天数再加1天
DateTime thisMonthFirst = DateTime.Now.AddDays(1 - DateTime.Now.Day).Date;

// 当月最后一天:先找到下个月的第一天,再减去1秒
DateTime thisMonthLast = DateTime.Now.AddDays(1 - DateTime.Now.Day).Date.AddMonths(1).AddSeconds(-1);

三、计算上月第一天和最后一天

在上个月计算中,先锁定当月第一天,然后通过加减月份来推导上月的起始与结束时间点,逻辑清晰且不易出错。

DateTime today = DateTime.Today; // 当天时间(无时分秒)

// 当前月第一天
DateTime thisMonth = new DateTime(today.Year, today.Month, 1);

// 上月第一天:当前月第一天往前推一个月
DateTime lastMonthFirst = thisMonth.AddMonths(-1);

// 上月最后一天:当前月第一天退一天即为上月最后一天
DateTime lastMonthLast = thisMonth.AddDays(-1);

四、判断本周是星期几

`DayOfWeek`枚举默认以 Sunday(周日)为 0,Saturday(周六)为 6。若业务要求周一为第一天或周日为第七天,需要进行简单的条件转换。

// 原始 DayOfWeek: 周日=0, 周一=1 ... 周六=6
int daysInWeekOriginal = (int)DateTime.Now.DayOfWeek;

// 调整后: 使周日变为 7, 周一至周六保持 1-6
int adjustedDay = (int)DateTime.Now.DayOfWeek == 0 ? 7 : (int)DateTime.Now.DayOfWeek;

五、计算本月是第几周

判断某日属于当月第几周,通常需要依赖一个辅助方法,因为内置库不直接提供基于“月”的周数计算。此处引用了一个通用的辅助调用方式:

// WeekOfMonth 为自定义辅助方法,需根据具体实现调用
int weekNumber = WeekOfMonth(DateTime.Now, false);

六、计算本年是第几周

年度周数的计算较为复杂,通常遵循 ISO 8601 标准或简单按自然周划分。以下代码采用了一种常见的自然周计算逻辑:首先确定当年第一周的起始偏移量,再结合当前是一年中的第几天来计算。

private int GetWeekOfYear()
{
    var dt = DateTime.Now;
    // 获取今年1月1日是星期几
    int firstWeekend = Convert.ToInt32(DateTime.Parse(dt.Year + "-1-1").DayOfWeek);
    
    // 计算第一周的实际开始天数偏移
    // 如果1月1日是周日(0),则第一周算作完整一周(7天),weekDay为1
    // 否则,weekDay为7减去星期数加1
    int weekDay = firstWeekend == 0 ? 1 : (7 - firstWeekend + 1);
    
    // 获取当前是该年第几天
    int currentDay = dt.DayOfYear;
    
    // 计算周数并向上取整
    int current_week = Convert.ToInt32(Math.Ceiling((currentDay - weekDay) / 7.0)) + 1;
    return current_week;
}

七、获取前 N 周的周一和周日

在处理周报或历史数据对比时,可能需要回溯特定周的时间范围。以下循环结构可遍历过去 N 周的起止日期。注意处理周日作为一周开始或结束的时区差异(本例视周日为周末最后一天)。

private void PrintDaysOfLastNWeeks(int n)
{
    DateTime today = DateTime.Now;
    // 统一周日为 7,方便计算
    int daysInWeek = (int)today.DayOfWeek == 0 ? 7 : (int)today.DayOfWeek;

    for (int i = n; i > 0; i--)
    {
        // 目标周的天数偏移量
        int totalOffset = 7 * i + daysInWeek;
        
        // 该周起始日(周一):今天减去总偏移量再加1天
        DateTime firstDay = today.AddDays(1 - totalOffset);
        
        // 该周结束日(周日):今天减去总偏移量再加7天
        DateTime lastDay = today.AddDays(7 - totalOffset);
        
        // 在此处处理 firstDay 和 lastDay 的逻辑
    }
}

八、获取本周一到当前日

快速计算从本周周一到今天的时间跨度,常用于统计本周累计数据。

private void GetCurrentWeekRange()
{
    // 同样处理周日问题,设周日为7
    int daysInWeek = (int)DateTime.Now.DayOfWeek == 0 ? 7 : (int)DateTime.Now.DayOfWeek;
    
    // 本周一:今天减去(当前星期数-1)天
    DateTime monday = DateTime.Now.AddDays(1 - daysInWeek);
    DateTime now = DateTime.Now;
}

九、前端控件绑定时的日期格式化

在 C# 后端向前端控件(如 GridView、Repeater 等 DataBound 控件)绑定数据时,可以直接在绑定表达式中对 DateTime 字段进行格式化处理,无需在代码层预先转换字符串。

// 在 ASP.NET 绑定语法中
// Bind("ColumnName", "{0:yyyy/MM/dd}")
// 这将直接把数据库中的 datetime 字段格式化为 YYYY/MM/DD 输出

以上就是 C# 常用日期时间方法的详细内容,更多关于 C# DateTime 操作技巧的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表