rey’s developer blog

ユーザ系SIerに勤めるSEがプログラミング、データベース、OS、SNS、ガジェットなどを中心に備忘録変わりに書いていきます。

【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