如何在IHP中处理日期?是否有默认的实现方案?
代码修改方案
你可以直接用IHP默认提供的时间工具完成需求,set语句部分有两种实现方式:
方式1:使用应用服务器当前时间(推荐)
直接调用getCurrentTime获取当前UTC时间赋值即可,修改后完整代码如下:
action UpdatePostAction { postId } = do post <- fetch postId post |> buildPost |> validateIsUnique #title >>= ifValid \case Left post -> render EditView { .. } Right post -> do now <- getCurrentTime post <- post |> set #created_at now |> updateRecord let t = get #title post setSuccessMessage $ "Post '" <> t <> "' updated" redirectTo PostsAction
方式2:使用数据库NOW()函数
如果需要严格使用数据库侧的当前时间,可以通过SQL表达式实现:
post <- post |> set #created_at (unsafeCoerce $ sqlExpr "NOW()") |> updateRecord
该方式需要确认字段类型和数据库返回的时间类型兼容,普通场景优先使用第一种方案。
IHP内置时间工具说明
IHP本身已经内置了完整的日期时间处理能力,不需要额外引入第三方工具:
- 框架默认自动导入
Data.Time模块的常用函数,支持时间获取、格式转换、时间差计算等常见操作 - 生成数据库迁移脚本时如果给时间字段设置
default now()的默认值,创建新记录时会自动填充当前时间,无需手动赋值 - 视图层也内置了时间格式化的相关助手函数,可直接调用实现本地化时间展示
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

