2010-04-28 90 views
7

我使用字符串模板創建了一封電子郵件,但是當我打印出一個日期時,它會打印出完整的日期(例如。Wed Apr 28 10:51:37 BST 2010)。我想以dd/mm/yyyy格式打印出來,但不知道如何在.st文件中對其進行格式化。在字符串模板中格式化日期電子郵件

我不能單獨修改(使用Java的simpleDateFormatter),因爲我遍歷的日期對象的集合的日期。

有沒有辦法在.st電子郵件模板中格式化日期?

+0

我不確定我是否明白爲什麼你不能使用simpleDateFormatter - 如果你要將對象寫入文本文件,是不是在迭代某個層次的對象? – Quotidian 2010-04-28 13:17:52

回答

6

使用額外的渲染器是這樣的:

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

它應該工作

+0

優秀!謝謝! – Ger 2010-05-04 14:35:48

0

設定日期格式的一個非常重要的事實是在月份使用「MM」而不是「mm」。 「mm」用於分鐘。使用「mm」而不是「MM」通常會引入難以發現的錯誤。

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

StringTemplate 4包含一個DateRenderer類。

我的以下實例是NumberRenderer對documentation on Renderers修改版本在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(); 

所提供的選項:

  • 「短」=> DateFormat.SHORT(默認)
  • 「中等」=> DateFormat.MEDIUM
  • 「長」=> DateFormat.LONG
  • 「滿」=> DateFormat.FULL

或者,您可以使用自定義格式,像這樣:

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

你可以看到這些選項和其他細節DateRenderer Java源上here