二开案例.表达式函数.日期部分函数

【应用场景】表达式中如果获取日期的某个部分,比如年、月、日,周?
【演示案例】给采购订单添加保存校验器,当采购订单上的采购日期和核算日期不在同一周时,禁止保存单据。

【实现步骤】
<1>编写函数,代码如下。
using Kingdee.BOS;
using Kingdee.BOS.Core.Metadata.Expression.FuncDefine;
using System;
using System.Globalization;
namespace Jac.XkDemo.BOS.Core.Functions
{
/// <summary>
/// 【函数】日期部分函数
/// 用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
/// </summary>
[Serializable]
public class DatePartFuncDefine : AbstractFuncDefine
{
public DatePartFuncDefine()
{
}
public DatePartFuncDefine(Context ctx, dynamic obj)
{
m_ctx = ctx;
m_obj = obj;
}
public override IFuncDefine GetFunctionDefine(Context ctx, dynamic obj)
{
return new DatePartFuncDefine(ctx, obj);
}
public override object GetFuncDefine()
{
return new Func<string, object, int>(GetDatePart);
}
/// <summary>
/// 日期部分函数,用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
/// </summary>
/// <param name="format">格式</param>
/// <param name="dtObj">日期</param>
/// <returns></returns>
int GetDatePart(string format, object dtObj)
{
#region 传入参数校验
DateTime dt;
if (dtObj is DateTime)
{
dt = (DateTime)dtObj;
}
else if (dtObj is string)
{
dt = Convert.ToDateTime(dtObj);
}
else
{
return -1;
}
if (string.IsNullOrWhiteSpace(format))
{
return -1;
}
#endregion
#region 计算日期部分
switch (format)
{
case "year":
case "yyyy":
case "yy": // 年
return dt.Year;
case "qq":
case "q": // 季度
return (dt.Month - 1) / 3 + 1;
case "month":
case "mm":
case "m": // 月
return dt.Month;
case "day":
case "dd":
case "d": // 日
return dt.Day;
case "hour":
case "hh":
case "h": // 时
return dt.Hour;
case "minute":
case "mi":
case "n": // 分
return dt.Minute;
case "second":
case "ss":
case "s": // 秒
return dt.Second;
case "millisecond": // 毫秒
case "ms": // 毫秒
return dt.Millisecond;
case "week":
case "dw":
case "w": // 星期
return (int)dt.DayOfWeek; // 0周日1周一6周六
case "dy":
case "y": // 年中的日
return dt.DayOf
二开案例.表达式函数.日期部分函数
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



