【问题标题】:Format date in String Template email在字符串模板电子邮件中格式化日期
【发布时间】:2011-02-13 06:59:45
【问题描述】:

我正在使用字符串模板创建电子邮件,但是当我打印出日期时,它会打印出完整日期(例如,2010 年 4 月 28 日星期三 10:51:37 BST)。我想以 dd/mm/yyyy 格式打印出来,但不知道如何在 .st 文件中格式化。

我无法单独修改日期(使用 java 的 simpleDateFormatter),因为我遍历了带有日期的对象集合。

有没有办法格式化 .st 电子邮件模板中的日期?

【问题讨论】:

  • 我不确定我是否理解您为什么不能使用 simpleDateFormatter - 如果您将对象写入文本文件,您不是在某个级别上迭代对象吗?

标签: java email date formatting stringtemplate


【解决方案1】:

StringTemplate 4 包含一个 DateRenderer 类。

我下面的示例是 Java 中 documentation on Renderers 上 NumberRenderer 的修改版本

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 源代码here 上查看这些选项和其他详细信息

【讨论】:

    【解决方案2】:

    这是一个基本的 Java 示例,请参阅StringTemplate documentation on Object Rendering 了解更多信息。

    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();
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        像这样使用额外的渲染器:

        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"$
        

        它应该可以工作

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-10
          • 1970-01-01
          • 2020-04-22
          • 1970-01-01
          相关资源
          最近更新 更多