在String模板邮件中格式化日期

7
我正在使用String Template创建电子邮件,但当我打印日期时,它会打印出完整的日期(例如:Wed Apr 28 10:51:37 BST 2010)。我想以dd/mm/yyyy的格式打印出来,但不知道如何在.st文件中进行格式化。
我无法单独修改日期(使用java的simpleDateFormatter),因为我要遍历具有日期的对象集合。
是否有一种方法可以在.st电子邮件模板中格式化日期?

我不确定我理解为什么您不能使用simpleDateFormatter - 如果您要将对象写入文本文件,无论如何都必须在某个级别上迭代这些对象吧? - Quotidian
4个回答

8

可以像这样使用其他渲染器:

internal class AdvancedDateTimeRenderer : IAttributeRenderer
{
    public string ToString(object o)
    {
        return ToString(o, null);
    }

    public string ToString(object o, string formatName)
    {
        if (o == null)
            return null;

        if (string.IsNullOrEmpty(formatName))
            return o.ToString();

        DateTime dt = Convert.ToDateTime(o);

        return string.Format("{0:" + formatName + "}", dt);
    }
}

然后将此添加到您的StringTemplate中,如下所示:
var stg = new StringTemplateGroup("Templates", path);
stg.RegisterAttributeRenderer(typeof(DateTime), new AdvancedDateTimeRenderer());

然后在 st 文件中:

$YourDateVariable; format="dd/mm/yyyy"$

它应该可以正常工作


2
这里是一个基本的Java示例,详见StringTemplate对象渲染文档获取更多信息。
StringTemplate st = new StringTemplate("now = $now$");
st.setAttribute("now", new Date());
st.registerRenderer(Date.class, new AttributeRenderer(){
    public String toString(Object date) {
        SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy");
        return f.format((Date) date);
    }
});
st.toString();

1

StringTemplate 4 包含一个 DateRenderer 类。

下面的示例是 NumberRenderer 的修改版本,参考了 Java 中关于 渲染器文档 的内容。

String template =
    "foo(right_now) ::= << <right_now; format=\"full\"> >>\n";


STGroup g = new STGroupString(template);
g.registerRenderer(Date.class, new DateRenderer());
ST st = group.getInstanceOf("foo");
st.add("right_now", new Date()); 
String result = st.render();

格式映射的提供选项如下:

  • "short" => DateFormat.SHORT(默认)
  • "medium" => DateFormat.MEDIUM
  • "long" => DateFormat.LONG
  • "full" => DateFormat.FULL

或者,您可以使用自定义格式,如下所示:

foo(right_now) ::= << <right_now; format="MM/dd/yyyy"> >>

您可以在DateRenderer Java源代码这里中查看这些选项和其他细节。


0

在设置日期格式时,一个非常重要的事实是使用“MM”而不是“mm”表示月份。 “mm”应用于表示分钟。通常使用“mm”代替“MM”会引入难以发现的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接