ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

金蝶二开:26号制会计期间,一个 PeriodUtil 帮你算对账期

金蝶二开:26号制会计期间,一个 PeriodUtil 帮你算对账期 一、背景与痛点做金蝶二开的朋友都懂很多企业的结账周期不是自然月。工资核算、业务考核、财务报表常按「上月 26 号到下月 25 号」算一个周期。报表取数、单据过滤、WebAPI 传参处处要跟这个账期打交道日期一旦算错一个月的账就对不上。平时跟账期打交道跑不掉这么几件事日期归属算不对某天到底落在哪个期间分水岭是 26 号手算容易错跨年更是一团乱麻期间边界拿不准这个账期从哪天开始、到哪天结束边界时间总是差一天、差一秒逻辑散落各处每个报表、每个接口各写一套判断换个结账日就要满项目找重复计算容易漏同样的「落在哪个期间」逻辑到处重算改一处漏一处。所以我把这段逻辑收进一个静态工具类PeriodUtil三个方法各管一件事下面拆开讲。二、功能概览规则其实只有一句每月 26 日到次月 25 日算一个会计期间。分水岭就是 26 号这一天25 号还在当月账期里一到 26 号就跳进下个月。拿几个日期举例2026-08-15 属于期间 2026-08也就是 07-26 到 08-25 这一段2026-08-26 属于期间 2026-09也就是 08-26 到 09-25 这一段。工具类里就三个静态方法各管一件事方法作用返回GetPeriod(DateTime, out int, out int)算某天落在哪个期间年份、月份GetPeriodBeginTime(DateTime)算所在期间的起始时刻起始日 00:00:00GetPeriodEndTime(DateTime)算所在期间的结束时刻结束日 23:59:59三、技术要点1. 工具类全貌using System; namespace KingdeeWings.Utils { /// summary /// 自定义会计期间工具类26 号制。 /// 规则每月 26 日至次月 25 日为一个会计期间。 /// /summary public static class PeriodUtil { /// summary期间起始日/summary public const int PeriodBeginDay 26; /// summary期间结束日/summary public const int PeriodEndDay 25; /// summary /// 根据时间获取期间年/月 /// /summary /// param namedt任意日期/param /// param nameyear期间所属年份/param /// param namemonth期间所属月份/param public static void GetPeriod(DateTime dt, out int year, out int month) { var tmpDate dt; if (dt.Day PeriodBeginDay) { tmpDate dt.AddMonths(1); } year tmpDate.Year; month tmpDate.Month; } /// summary /// 获取指定时间所在期间的开始时间即期间起始日 00:00:00 /// /summary /// param namedt任意日期/param /// returns期间起始日 00:00:00/returns public static DateTime GetPeriodBeginTime(DateTime dt) { var tmpDate dt.AddDays(-dt.Day 1).Date; if (dt.Day PeriodEndDay) tmpDate tmpDate.AddMonths(-1); var beginTime tmpDate.AddDays(PeriodBeginDay - 1); return beginTime; } /// summary /// 获取指定时间所在期间的结束时间即期间结束日 23:59:59 /// /summary /// param namedt任意日期/param /// returns期间结束日 23:59:59/returns public static DateTime GetPeriodEndTime(DateTime dt) { var tmpDate dt.AddDays(-dt.Day 1).Date; if (dt.Day PeriodBeginDay) tmpDate tmpDate.AddMonths(1); var endTime tmpDate.AddDays(PeriodEndDay - 1).AddHours(23).AddMinutes(59).AddSeconds(59); return endTime; } } }这里把「26」和「25」抽成了PeriodBeginDay、PeriodEndDay两个常量。以后结账日从 26 号改成别的日期只动这两个常量方法体不用碰。2. 方法一GetPeriod算日期落在哪个期间public static void GetPeriod(DateTime dt, out int year, out int month) { var tmpDate dt; if (dt.Day PeriodBeginDay) { tmpDate dt.AddMonths(1); } year tmpDate.Year; month tmpDate.Month; }规则落到代码只有一句判断日子大于等于 26就往后挪一个月用挪完之后的年/月当账期。拿 2026-08-25 进来还在当月返回 (2026, 8)拿 2026-08-26 进来往后挪到 9 月返回 (2026, 9)。跨年也不用专门处理AddMonths会自己进位2026-12-30 进来算出来的就是 (2027, 1)。3. 方法二GetPeriodEndTime算账期什么时候结束public static DateTime GetPeriodEndTime(DateTime dt) { var tmpDate dt.AddDays(-dt.Day 1).Date; if (dt.Day PeriodBeginDay) tmpDate tmpDate.AddMonths(1); var endTime tmpDate.AddDays(PeriodEndDay - 1).AddHours(23).AddMinutes(59).AddSeconds(59); return endTime; }第一步dt.AddDays(-dt.Day 1).Date把日期拉回当月 1 号日子大于等于 26 就加一个月往下一个账期靠然后加 (25 - 1) 天落到 25 号再补上 23:59:59这就是这个账期的结束时刻。拿 2026-08-15 举例它所在的期间是 07-26 到 08-25返回 2026-08-25 23:59:59拿 2026-08-26 举例期间是 08-26 到 09-25返回 2026-09-25 23:59:59。4. 方法三GetPeriodBeginTime算账期从什么时候开始public static DateTime GetPeriodBeginTime(DateTime dt) { var tmpDate dt.AddDays(-dt.Day 1).Date; if (dt.Day PeriodEndDay) tmpDate tmpDate.AddMonths(-1); var beginTime tmpDate.AddDays(PeriodBeginDay - 1); return beginTime; }跟上一个方法正好反着。先把日期拉回当月 1 号日子小于等于 25 就减一个月回到上一账期再加 (26 - 1) 天落到 26 号作为期间起始日的零点。拿 2026-08-15 举例它所在期间从 07-26 开始返回 2026-07-26 00:00:00拿 2026-08-26 举例期间从 08-26 开始返回 2026-08-26 00:00:00。四、快速上手1. 环境要求项目要求目标框架.NET Framework依赖无第三方依赖纯标准库引入方式直接把PeriodUtil.cs拷进项目即可2. 使用步骤把PeriodUtil.cs放进项目或从 kingdee-wings 引入报表取数 / 单据过滤前先拿账期时间点var dt DateTime.Now; PeriodUtil.GetPeriod(dt, out var year, out var month); // 当前落在哪个期间 var begin PeriodUtil.GetPeriodBeginTime(dt); // 期间起点左闭 var end PeriodUtil.GetPeriodEndTime(dt); // 期间终点右闭拿这两个时间点拼 FilterString 过滤单据var filter $FDate {begin:yyyy-MM-dd} AND FDate {end:yyyy-MM-dd};3. 边界测试25 号和 26 号是分水岭两个都验一遍最稳。下面几个代表性输入输入日期GetPeriodGetPeriodEndTimeGetPeriodBeginTime2026-07-10(2026, 7)2026-07-25 23:59:592026-06-26 00:00:002026-08-25(2026, 8)2026-08-25 23:59:592026-07-26 00:00:002026-08-26(2026, 9)2026-09-25 23:59:592026-08-26 00:00:002026-12-30(2027, 1)2027-01-25 23:59:592026-12-26 00:00:0025 号返回当月26 号立刻跳进下月两个边界都没错位。GetPeriodBeginTime和GetPeriodEndTime拼起来正好是一个左闭右闭的区间中间任何一天都能用begin 某天 end判断它是不是落在当前账期里。五、总结这套工具不大就三个静态方法加两个常量。26 号制里常碰到的三件事落在哪个期间、期间从哪天开始、到哪天结束都覆盖了跨年这些容易错的地方也处理好了。报表取数、单据过滤、WebAPI 传参凡是按账期圈时间的直接拿去用。提示结账日从 26 号调整到别的日期时改PeriodBeginDay/PeriodEndDay两个常量即可方法体不用碰。开源地址csharp/KingdeeWings/KingdeeWings/Utils/PeriodUtil.cs · gydihl/KingdeeWings - Gitee.com
返回列表