【C#/.NET】String型時刻とdouble型の相互変換と加減算コードサンプル(まるめ誤差あり)
C#でのString型の時刻(HH:MM:SS.TTT)とdouble型の相互変換と加算、減算コードのサンプルです。
浮動小数点型のまるめ誤差は許容します。
////////////////////////////////////////////////// //ここから ////////////////////////////////////////////////// private const double MINUTE_TO_SECOND = 60; private const double HOUR_TO_SECOND = 3600; private const double SECOND_TO_MSECOND = 1; private const char CONST_CHAR_EN_COLOGNE = ':'; private const char CONST_CHAR_EN_DOT = '.'; /// /// 「HH:MM:SS.TTT」をn秒に変換する。 /// ///時刻(HH:MM:SS) /// <returns>秒数</returns> public static double ConvStringTimeToSec(String time) { String[] timeSplit = time.Split(CONST_CHAR_EN_COLOGNE); if (timeSplit.Length != 3) { return -1; } try { double hour = double.Parse(timeSplit[0]); double minute = double.Parse(timeSplit[1]); double second = double.Parse(timeSplit[2]); return (hour * HOUR_TO_SECOND) + (minute * MINUTE_TO_SECOND) + second; } catch (Exception e) { return -1; } } /// /// 秒数を時間(HH:MM:SS.TTT)に変換する。 /// ///秒数 /// <returns>時間(HH:MM:SS.TTT)</returns> public static String ConvSecToStringTime(double sec) { String hour = String.Format("{0:00}", (int)(sec / HOUR_TO_SECOND)); String minute = String.Format("{0:00}", (int)((sec % HOUR_TO_SECOND) / MINUTE_TO_SECOND)); String second = String.Format("{0:00}", (int)(sec % MINUTE_TO_SECOND)); String mSec = "000"; if (sec.ToString().IndexOf(CONST_CHAR_EN_DOT) != -1) { mSec = sec.ToString().Split(CONST_CHAR_EN_DOT)[1]; if (mSec.Length > 3) { mSec = mSec.Substring(0, 3); } } return new StringBuilder().Append(hour).Append(CONST_CHAR_EN_COLOGNE) .Append(minute).Append(CONST_CHAR_EN_COLOGNE) .Append(second).Append(CONST_CHAR_EN_DOT) .Append(mSec).ToString(); } /// /// 開始時間 終了時間の差をdouble型で返す。 /// ※「01:46:00.123」など、日をまたぐ時間の場合、「25:46:00.123」と入力してください。 /// ///開始時間(HH:MM:SS) ///終了時間(HH:MM:SS) /// <returns>時間の差</returns> public static double GetForSec(String startTime, String endTime) { double iStartTime = ConvStringTimeToSec(startTime); double iEndTime = ConvStringTimeToSec(endTime); double iForTime = iEndTime - iStartTime; if (iStartTime == -1 || iEndTime == -1 || iForTime < 0) { return -1; } return iForTime; } /// /// 開始時間 終了時間の差を"HH:MM:SS.TTT"形式返す。 /// ///開始時間(HH:MM:SS) ///終了時間(HH:MM:SS) /// <returns>時間の差</returns> public static String GetForTime(String startTime, String endTime) { return ConvSecToStringTime(GetForSec(startTime, endTime)); } /// /// 時間("HH:MM:SS.TTT")と時間("HH:MM:SS.TTT")をプラスし"HH:MM:SS.TTT"で返す /// /// /// /// <returns></returns> public static String SumTime(String time1, String time2) { return ConvSecToStringTime(ConvStringTimeToSec(time1) + ConvStringTimeToSec(time2)); } /// /// 時間("HH:MM:SS.TTT")と時間("HH:MM:SS.TTT")をプラスしdouble型で返す /// /// /// /// <returns></returns> public static double SumTimeToSec(String time1, String time2) { return ConvStringTimeToSec(time1) + ConvStringTimeToSec(time2); } ////////////////////////////////////////////////// //ここまで //////////////////////////////////////////////////
*1:sec % HOUR_TO_SECOND) / MINUTE_TO_SECOND