ちょっと生きづらさを抱えた人へ、気持ちを楽にするためのお手紙です。

【Java】日付系でいろいろ

ぱぱーっと作ってしまったので、ツメが甘いところがあるかも。
Javaで日付系のメソッドをいろいろ。

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

public class TimeUtil {
	// 年月日
	public static final String DATE_FORMAT_1 = "yyyyMMdd";
	// 年月日時分
	public static final String DATE_FORMAT_2 = "yyyyMMddHHmmss";
	// 年月日時分秒ミリ秒
	public static final String DATE_FORMAT_3 = "yyyyMMddHHmmssSSS";
	// 年/月/日
	public static final String DATE_FORMAT_4 = "yyyy/MM/dd";
	// 年/月/日 時:分:秒
	public static final String DATE_FORMAT_5 = "yyyy/MM/dd HH:mm:ss";
	// 年-月-日 時:分:秒
	public static final String DATE_FORMAT_6= "yyyy-MM-dd HH:mm:ss";
	// 曜日まで
	public static final String DATE_FORMAT_7 = "yyyy年MM月dd日 EEE曜日";
	// 時分秒
	public static final String DATE_FORMAT_8 = "HH:mm:ss";

	/**
	 * システム日時を指定のフォーマットで取得
	 * @param format 返却値フォーマット
	 * @return システム日時
	 */
	public String getSysDate(String format) {
		Date sysdate = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(sysdate);
	}

	/**
	 * 日時を指定のフォーマットに変換する
	 * @param date 日時文字列
	 * @param format 返却値フォーマット
	 * @return フォーマット後日時
	 */
	public String formatDate(String srcDate, String format) {
		String fmtDate = null;
		// 数字以外は除去し、ミリ秒まで0で桁を補正する
		String strDate = figure(srcDate);
		Date dDate = strToDate(strDate, DATE_FORMAT_3);
		if (dDate != null) {
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			fmtDate = sdf.format(dDate);
		}
		return fmtDate;
	}

	/**
	 * fromからtoの差分を分で算出する
	 * @param fromDate from
	 * @param toDate to
	 * @return fromからtoの差分(分)
	 */
	public long diffDateMinute(String fromDate, String toDate) {
		long diff = diffDateMill(fromDate, toDate);
		return diff / (1000 * 60); // ミリ秒から分に計算
	}

	/**
	 * fromからtoの差分を秒で算出する
	 * @param fromDate from
	 * @param toDate to
	 * @return fromからtoの差分(秒)
	 */
	public long diffDateSecond(String fromDate, String toDate) {
		long diff = diffDateMill(fromDate, toDate);
		return diff / 1000; // ミリ秒から秒に計算
	}

	/**
	 * fromからtoの差分をHH:mm:ssで返却する
	 * @param fromDate from
	 * @param toDate to
	 * @return fromからtoの差分(HH:mm:ss)
	 */
	public String diffDateStr(String fromDate, String toDate) {
		long diffSecond = diffDateSecond(fromDate, toDate);

		long hour = diffSecond / 60 / 60;     // 時
		long minute = (diffSecond / 60) % 60; // 分
		long second = diffSecond % 60;        // 秒

		String strDiff = String.format("%02d", hour)
				+ ":" + String.format("%02d", minute)
				+ ":" + String.format("%02d", second);

		return strDiff;
	}

	/**
	 * fromからto の日時の差分をミリ秒で算出する
	 * @param fromDate from
	 * @param toDate to
	 * @return fromからtoの差分(ミリ秒)
	 */
	public long diffDateMill(String fromDate, String toDate) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_3);
		String sDate1 = figure(fromDate);
		String sDate2 = figure(toDate);

		Date dDate1 = null;
		Date dDate2 = null;
		try {
			dDate1 = sdf.parse(sDate1);
			dDate2 = sdf.parse(sDate2);
		} catch(ParseException e) {
			System.out.println("日付形式の文字列ではありません");
		}
		long lDate1 = dDate1.getTime();
		long lDate2 = dDate2.getTime();

		long diff = lDate2 - lDate1;

		return diff;
	}

	/**
	 * 時間(h)を加算する
	 * @param date 日付文字列
	 * @param addHour 加算時間(h)
	 * @param format 返却値フォーマット
	 * @return 計算後時間文字列
	 */
	public String addHour(String date, int addHour, String format) {
		Calendar cal = strToCalendar(date);
		cal = addTime(cal, 0, 0, 0, addHour, 0, 0, 0);

		SimpleDateFormat sdf = new SimpleDateFormat(format);
		String formatDate = sdf.format(cal.getTime());

		return formatDate;
	}

	/**
	 * 日時に加算する
	 * @param cal カレンダー
	 * @param addYear 年
	 * @param addMonth 月
	 * @param addDate 日
	 * @param addHour 時間
	 * @param addMinute 分
	 * @param addSecond 秒
	 * @param addMillisecond ミリ秒
	 * @return 処理結果
	 */
	public Calendar addTime(Calendar cal,
			int addYear, int addMonth, int addDate,
			int addHour, int addMinute, int addSecond,
			int addMillisecond) {

		cal.add(Calendar.YEAR, addYear); // 年
		cal.add(Calendar.MONTH, addMonth); // 月
		cal.add(Calendar.DATE, addDate); // 日
		cal.add(Calendar.HOUR_OF_DAY, addHour); // 時
		cal.add(Calendar.MINUTE, addMinute); // 分
		cal.add(Calendar.SECOND, addSecond); // 秒
		cal.add(Calendar.MILLISECOND, addMillisecond); // ミリ秒

		return cal;
	}

	/**
	 * 日付文字列→Calendar
	 * @param date 日時文字列
	 * @return Calendar型
	 */
	public Calendar strToCalendar(String date) {
		String strDate = formatDate(date, DATE_FORMAT_6);
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_6);
		Date dDate = null;
		try {
			dDate = new Date(sdf.parse(strDate).getTime());
		} catch (ParseException e) {
			System.out.println("パースエラー");
			return null;
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(dDate);
		return cal;
	}

	/**
	 * 日付文字列をDate型に変換する
	 * @param date 日付文字列
	 * @param format フォーマット
	 * @return Date
	 */
	public Date strToDate(String date, String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		sdf.setLenient(false);
		Date dDate = null;
		try {
			dDate = sdf.parse(date);
		} catch (ParseException e) {
			System.out.println("パースエラー");
		}
		return dDate;
	}

	/**
	 * Calendar型 をフォーマットした日付文字列に変換する
	 * @param cal カレンダー
	 * @param format フォーマット
	 * @return 日付文字列
	 */
	public String calToStr(Calendar cal, String format) {
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		String formatDate = sdf.format(cal.getTime());

		return formatDate;
	}

	/**
	 * 数字以外の文字を取り除き、ミリ秒に桁が満たない場合、0埋めする
	 * @param date 日付文字列
	 * @return 補完後の日付文字列
	 */
	public String figure(String date) {
		// 数字以外は除去し、ミリ秒まで0で桁を補正する
		String regExp = "[^\\d]";
		String strDate = date.replaceAll(regExp, "");
		strDate = String.format("%-17s", strDate).replace(" ", "0");

		return strDate;
	}
}

参考:Javaの道(http://www.javaroad.jp/)

2 COMMENTS

なつる

技術系の検索で飛んできて毒親ワードに引き寄せられました。
みすくちゃんの文章好みです。
過去記事を少ししか読んでないんですが、個人的にはケツがその後どうなったのか気になっています。筋トレはもちろん続ければ効果ありと思うんですが、よもやけつが盛り上がるとは考えた事がなかったので…。
そしてコメントがJAVAに書くところではないことでしたね。出社したらコード動かしてみます。

返信する
みすく

> なつるさん

コメントありがとうございます。
若干おしりっぽいものができたけれど、その後スリーサイズや太もも周りなど一切変化がなく、
筋肉もまったくつかなくて、筋トレは辞めてしまいました。
でも筋トレのストイックさは気に入っていたので、またやろうと思います。
コードにバグがあったら教えてください。

返信する

コメントを残す

メールアドレスが公開されることはありません。