Thursday, October 27, 2011

民國年的寫法 ( JSTL + EL + informix )

一、將資料庫存放的  西元年 轉成 中國年:
   1: /**
   2:  * 將西元年 轉成 中國年
   3:  */
   4: public static Date convertToMinguo(Date date){
   5:     if( date != null ) {
   6:         Calendar cal = Calendar.getInstance();
   7:         cal.setTime(date);
   8:         int year = cal.get(Calendar.YEAR) - 1911;
   9:         int month = cal.get(Calendar.MONTH);
  10:         int day = cal.get(Calendar.DAY_OF_MONTH);
  11:         cal.set(year, month, day);
  12:         return cal.getTime();
  13:     }       
  14:      return null;       
  15: } 

二、在JSPE畫面呈現中國年的方法:

   1: <%@ page language="java" contentType="text/html;charset=UTF-8"%>
   2: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
   3: <%@ taglib prefix="i18n" uri="http://www.bea.com/servers/p13n/tags/internationalization" %>
   4:  
   5: <fmt:setLocale value="zh-TW"/>
   6: <!-- 中國年的格式,可以定義在多國語言的設定檔裡,
   7:             省的每個人都要key ( pattern="yyyy年MM月dd日"  ) -->
   8: <c:set var="minguoPattern">
   9:         <i18n:getMessage messageName="minguopattern" />
  10: </c:set>
  11: <fmt:formatDate var="dateBegin" 
  12:                        value="${bulletin.dateBegin}" 
  13:                      pattern="${minguoPattern}" />
  14: <!-- 把 O100 TRIM 成 100 -->
  15: <c:out value="${fn:substringAfter(dateBegin, '0')}"/>

三、比較麻煩的是以 日期 為查詢條件,因為 informix的日期函數: DATE(),是以一個字符串變量為參數,其格式由環境變量 DBDATE 指定, 並返回一個 DATE 類型。在setnet32中格式必須設為是「MDY4/」

   1: /**
   2: * @param str 格式:100/MM/dd
   3: * @return  西元年:MM/dd/yyyy
   4: */
   5: public static String convertMDY4(String str){
   6:    if( str != null && !str.trim().isEmpty()) {
   7:        String year = str.substring(0, 3);
   8:        int y = Integer.parseInt( year ) + 1911;
   9:        String month = str.substring(4, 6);
  10:        String day = str.substring(7,9);
  11:        return String.format("%1$s/%2$s/%3$s", month, day, String.valueOf(y) );
  12:    }       
  13:     return null;       
  14:  }

四、最後,是資料確定要進資料庫之前,一定要再轉回西元年
為什麼? 因為要維持資料的一致性