Java

文字列とTimestamp型を相互変換する

kght6123

kght6123

文字列とTimestamp型を相互変換する

解説

文字列からTimestamp型への変換は、JavaのMessageFormatを使って、

文字列の年〜秒までの部分を日付(Date型)で取得し、ミリ秒〜マイクロ秒は、数値(Int型)で取得して

その取得した値を、新しく作ったTimestamp型に適用することで実現しています。

Timestamp型から文字列への変換にも、JavaのMessageFormatを使って、上記と逆のことをして変換しています。

(JavaのMessageFormatはめちゃくちゃ便利!)

あと、おまけにJavaの現在時刻をTimestampで取得する関数と、DB(Oracle)の現在時刻をTimestampで取得する関数も準備しています。

ソースコード

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.MessageFormat;
import java.text.ParseException;
import java.util.Date;

public class TimestampUtil {
	
	/**
	 * Timestampを文字列に変換する(マイクロ秒考慮)
	 * 
	 * @param ts
	 * @return
	 */
	public static String toString(final Timestamp ts) {
		final MessageFormat mf = 
				new MessageFormat("{0,date,yyyy-MM-dd-HH.mm.ss}.{1,number,000000}");
		return mf.format(new Object[] { ts, (long)ts.getNanos() / (long)1000});
	}
	
	/**
	 * 文字列をTimestampに変換する(マイクロ秒考慮)
	 * 
	 * @param str
	 * @return
	 * @throws ParseException
	 */
	public static Timestamp toTimestamp(final String str) throws ParseException {
		final MessageFormat mf = 
				new MessageFormat("{0,date,yyyy-MM-dd-HH.mm.ss}.{1,number,000000}");
		final Object[] objects = mf.parse(str);
		
		final Timestamp ts = new Timestamp(((Date)objects[0]).getTime());
		ts.setNanos(long2int((long)objects[1]) * 1000);
		return ts;
	}
	
	private static int long2int(long l) {
		return Integer.parseInt(Long.toString(l));
	}
	
	/**
	 * Databaseの現在時刻をTimestamp型で取得する
	 * 
	 * @param conn
	 * @param logger
	 * @return
	 * @throws SQLException
	 */
	public static Timestamp getNowTimestampForDatabase(final Connection conn, final Logger logger) throws SQLException
	{
		
		try (final PreparedStatement stmt = conn.prepareStatement("select systimestamp as ts from dual");
				final ResultSet rs = stmt.executeQuery();)
		{
			if(rs.next())
				return rs.getTimestamp(1);
			else
				throw new SQLException("SYSTIMESTAMPが取得できません");
		}
	}
	
	/**
	 * Javaの現在時刻をTimestamp型で取得する
	 * 
	 * @return
	 */
	public static Timestamp getNowTimestampForJava()
	{
		final long timeInMillis = System.currentTimeMillis();
		final long timeInNanos = System.nanoTime();
		final Timestamp timestamp = new Timestamp(timeInMillis);
		timestamp.setNanos((int)(timeInNanos % 1000000000));
		return timestamp;
	}
}