package com.bt.common.directive; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.util.Date; import com.jfinal.template.Directive; import com.jfinal.template.Env; import com.jfinal.template.TemplateException; import com.jfinal.template.expr.ast.Expr; import com.jfinal.template.expr.ast.ExprList; import com.jfinal.template.io.Writer; import com.jfinal.template.stat.ParseException; import com.jfinal.template.stat.Scope; /** * #date 日期格式化输出指令 * * 三种用法:
* 1:#date(createAt) 用默认 datePattern 配置,输出 createAt 变量中的日期值
* 2:#date(createAt, "yyyy-MM-dd HH:mm:ss") 用第二个参数指定的 datePattern,输出 createAt 变量中的日期值
* 3:#date() 用默认 datePattern 配置,输出 “当前” 日期值 * * 注意:
* 1:#date 指令中的参数可以是变量,例如:#date(d, p) 中的 d 与 p 可以全都是变量
* 2:默认 datePattern 可通过 Engine.setDatePattern(...) 进行配置 * * @author Max_Qiu */ public class MyDateDirective extends Directive { private Expr valueExpr; private Expr datePatternExpr; private int paraNum; @Override public void setExprList(ExprList exprList) { this.paraNum = exprList.length(); if (paraNum > 2) { throw new ParseException("#date 指令最多两个参数", location); } if (paraNum == 0) { this.valueExpr = null; this.datePatternExpr = null; } else if (paraNum == 1) { this.valueExpr = exprList.getExpr(0); this.datePatternExpr = null; } else if (paraNum == 2) { this.valueExpr = exprList.getExpr(0); this.datePatternExpr = exprList.getExpr(1); } } @Override public void exec(Env env, Scope scope, Writer writer) { if (paraNum == 1) { outputWithDatePattern(scope, env.getEngineConfig().getDatePattern(), writer); } else if (paraNum == 2) { Object datePattern = this.datePatternExpr.eval(scope); if (!(datePattern instanceof String)) { throw new TemplateException("#date 指令的第二个参数类型必须是 String", location); } outputWithDatePattern(scope, (String)datePattern, writer); } else { write(writer, LocalDateTime.now(), env.getEngineConfig().getDatePattern()); } } private void outputWithDatePattern(Scope scope, String datePattern, Writer writer) { Object value = valueExpr.eval(scope); if (value instanceof TemporalAccessor) { write(writer, (TemporalAccessor)value, datePattern); } else if (value instanceof Date) { write(writer, (Date)value, datePattern); } else if (value != null) { throw new TemplateException("#date 指令的第一个参数必须是实现TemporalAccessor接口的时间类型或者是Date类型", location); } } private void write(Writer writer, TemporalAccessor temporal, String datePattern) { String s; try { s = DateTimeFormatter.ofPattern(datePattern).format(temporal); } catch (Exception e) { throw new TemplateException("格式化出错,请检查第二个参数:" + datePattern, location, e); } try { writer.write(s, 0, s.length()); } catch (IOException e) { throw new TemplateException(e.getMessage(), location, e); } } private void write(Writer writer, Date date, String datePattern) { try { writer.write(date, datePattern); } catch (IOException e) { throw new TemplateException(e.getMessage(), location, e); } } }