/*
 * DateFormat.java
 *
 * Created on 2007/03/17, 13:25
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package org.itscool.stylist.function;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日付け操作用EL関数
 * @author KANO
 */
public class DateC {
    public static void main(String[] argv){
        DateC d = new DateC();
        String dateStr = "Sun Mar 11 00:00:00 JST 2007";
        System.out.println(d.format(dateStr, "yyyy/MM/dd"));
        String dateStr2 = (new Date()).toString();
        System.out.println(d.format(dateStr, "yyyy/MM/dd"));
        
    }
    
    public String add(Date date, String fmt, String kind, int num) {
        return add(date.toString(), fmt, kind, num);
    }
    
    /**
     * 日付型(EEE MMM dd HH:mm:ss 'JST' yyyy形式)を指定のフォーマットに変換します
     * @param dateStr Date型のtoString()を指定します
     * @param fmt 加算結果のフォーマットを指定します
     * @param kind 加算対象を指定します（y：年、M：月、d：日、h：時間、m：分、s：秒）
     * @return フォーマットされた文字列を返します
     */
    public String add(String dateStr, String fmt, String kind, int num) {
        if( dateStr == null || dateStr.length() == 0 ){
            return "";
        }
        DateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        
        try{
            String str = format(dateStr);
            Date date = sdf1.parse(str);
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            if( kind.equals("y")){
                cal.add(Calendar.YEAR, num);
            }else if( kind.equals("M")){
                cal.add(Calendar.MONTH, num);
            }else if( kind.equals("d")){
                cal.add(Calendar.DAY_OF_MONTH, num);
            }else if( kind.equals("h")){
                cal.add(Calendar.HOUR, num);
            }else if( kind.equals("m")){
                cal.add(Calendar.MINUTE, num);
            }else if( kind.equals("s")){
                cal.add(Calendar.SECOND, num);
            }
            SimpleDateFormat sdf2 = new SimpleDateFormat(fmt);
            dateStr = sdf2.format(cal.getTime());
        }catch(Exception e){
            e.printStackTrace();
        }
        
        return dateStr;
    }
    
    /**
     * 日付型(EEE MMM dd HH:mm:ss 'JST' yyyy形式)を指定のフォーマットに変換します
     * @param date Date型のインスタンスを指定します
     * @param fmt フォーマットを指定します
     * @return フォーマットされた文字列を返します
     */
    public String format(Date date, String fmt) {
        if( date == null) return "";
        return format(date.toString(), fmt);
    }
    
    /**
     * 日付型(EEE MMM dd HH:mm:ss 'JST' yyyy形式)を指定のフォーマットに変換します
     * @param dateStr Date型のtoString()を指定します
     * @param fmt フォーマットを指定します
     * @return フォーマットされた文字列を返します
     */
    public String format(String dateStr, String fmt) {
        if( dateStr == null || dateStr.length() == 0 ){
//            Date dft = new Date();
//            dateStr = dft.toString();
            return "";
        }
        DateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        String str = "";
        try{
            str = format(dateStr);
        }catch(Exception e){
//            Date dft = new Date();
//            dateStr = dft.toString();
//            str = format(dateStr);
            return dateStr;
        }
        try{
//            String str = format(dateStr);
            Date date = sdf1.parse(str);
            SimpleDateFormat sdf2 = new SimpleDateFormat(fmt);
            dateStr = sdf2.format(date);
        }catch(Exception e){
            e.printStackTrace();
            return dateStr;
        }
        
        return dateStr;
    }
    
    public static String format(Date date){
        return format(date.toString());
    }
    
    /**
     * 日付型(EEE MMM dd HH:mm:ss 'JST' yyyy形式)をyyyy/MM/dd hh:mm:ss形式に変換します
     * @param dateStr Date型のtoString()を指定します
     * @return フォーマットされた文字列を返します
     */
    public static String format(String dateStr){
        if( dateStr == null || dateStr.length() == 0 ){
            Date dft = new Date();
            dateStr = dft.toString();
        }
        String MMM = dateStr.substring(4, 7);
        String dd = dateStr.substring(8, 10);
        String hhmmss = dateStr.substring(11, 19);
        String yyyy = dateStr.substring(24, 28);
        
        return yyyy + "/" + cnvMMMtoMM(MMM) + "/" + dd + " " + hhmmss;
    }

    /**
     * MMMをMMに変換します
     * @param MMM JUN/FEB...といった月指定
     * @return 01から12までの月を返します
     */
    public static String cnvMMMtoMM(String MMM){
        if(MMM.equals("Jan")){
            return "01";
        }else if(MMM.equals("Feb")){
            return "02";
        }else if(MMM.equals("Mar")){
            return "03";
        }else if(MMM.equals("Apr")){
            return "04";
        }else if(MMM.equals("May")){
            return "05";
        }else if(MMM.equals("Jun")){
            return "06";
        }else if(MMM.equals("Jul")){
            return "07";
        }else if(MMM.equals("Aug")){
            return "08";
        }else if(MMM.equals("Sep")){
            return "09";
        }else if(MMM.equals("Oct")){
            return "10";
        }else if(MMM.equals("Nov")){
            return "11";
        }else if(MMM.equals("Dec")){
            return "12";
        }else{
            return "  ";
        }
    }
}
