如何在PowerBuilder中编写表达式计算年/月格式年龄及编辑掩码日期转年龄
PowerBuilder 年龄计算与实时显示实现
一、年/月/日维度的年龄计算表达式
以下表达式基于出生日期字段(示例用dt_birth)和当前日期Today()计算,可直接用于数据窗口或脚本中:
1. 仅计算周岁(年维度)
Year(Today()) - Year(dt_birth) - If(Month(Today()) < Month(dt_birth) Or (Month(Today()) = Month(dt_birth) And Day(Today()) < Day(dt_birth)), 1, 0)
逻辑:先算年份差,若当前月日早于出生日期的月日,说明还没到当年生日,周岁减1。
2. 年+月维度的年龄(格式:X年Y个月)
String(Year(Today()) - Year(dt_birth) - If(Month(Today()) < Month(dt_birth) Or (Month(Today()) = Month(dt_birth) And Day(Today()) < Day(dt_birth)), 1, 0)) + "年" + & String(If(Month(Today()) >= Month(dt_birth), Month(Today()) - Month(dt_birth), 12 + Month(Today()) - Month(dt_birth)) - If(Day(Today()) < Day(dt_birth) And Month(Today()) < Month(dt_birth), 1, 0)) + "个月"
逻辑:先算周岁,再计算剩余月份;跨年度时用12加当前月份减出生月份,若当前日早于出生日且跨月,月份数再减1。
3. 年+月+日维度的年龄(格式:X年Y个月Z天)
String(Year(Today()) - Year(dt_birth) - If(Month(Today()) < Month(dt_birth) Or (Month(Today()) = Month(dt_birth) And Day(Today()) < Day(dt_birth)), 1, 0)) + "年" + & String(If(Month(Today()) >= Month(dt_birth), Month(Today()) - Month(dt_birth), 12 + Month(Today()) - Month(dt_birth)) - If(Day(Today()) < Day(dt_birth), 1, 0)) + "个月" + & String(If(Day(Today()) >= Day(dt_birth), Day(Today()) - Day(dt_birth), Day(RelativeDate(Today(), -Day(Today()))) - Day(dt_birth) + Day(Today()))) + "天"
逻辑:日部分处理跨月情况,用RelativeDate获取上月最后一天的天数,计算剩余天数。
二、EditMask选择日期转年月格式年龄并实时显示在Computed Field
假设EditMask控件名为em_birth,Computed Field名为cf_age,步骤如下:
1. 配置EditMask控件
- 将EditMask的Mask类型设为
Date,示例Mask格式为yyyy-mm-dd,确保用户能选择或输入合法出生日期。
2. 设置Computed Field的表达式
直接绑定EditMask的输入值,计算年月格式年龄:
If IsNull(em_birth.Text) Or em_birth.Text = "", "", & String(Year(Today()) - Year(Date(em_birth.Text)) - If(Month(Today()) < Month(Date(em_birth.Text)) Or (Month(Today()) = Month(Date(em_birth.Text)) And Day(Today()) < Day(Date(em_birth.Text))), 1, 0)) + "年" + & String(If(Month(Today()) >= Month(Date(em_birth.Text)), Month(Today()) - Month(Date(em_birth.Text)), 12 + Month(Today()) - Month(Date(em_birth.Text))) - If(Day(Today()) < Day(Date(em_birth.Text)) And Month(Today()) < Month(Date(em_birth.Text)), 1, 0)) + "个月"
逻辑:先判断EditMask是否为空,为空则显示空;否则按年月维度计算并格式化年龄。
3. 实现实时刷新
在EditMask的Modified事件中添加以下代码,确保用户修改日期后Computed Field立即更新:
cf_age.Refresh()
内容的提问来源于stack exchange,提问作者Anil
相关产品推荐
相关产品推荐

