Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others. 4 : // This program and the accompanying materials are made available under the 5 : // terms of the Eclipse Public License 2.0 which is available at 6 : // https://www.eclipse.org/legal/epl-2.0/ 7 : // This Source Code may also be made available under the following Secondary 8 : // Licenses when the conditions for such availability set forth in the Eclipse 9 : // Public License 2.0 are satisfied: GNU General Public License, version 2 10 : // or later which is available at 11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html 12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later 13 : /****************************************************************************/ 14 : /// @file SUMOTime.cpp 15 : /// @author Daniel Krajzewicz 16 : /// @author Jakob Erdmann 17 : /// @author Michael Behrisch 18 : /// @author Mirko Barthauer 19 : /// @date Fri, 29.04.2005 20 : /// 21 : // Variables, methods, and tools for internal time representation 22 : /****************************************************************************/ 23 : #include <config.h> 24 : 25 : #include <sstream> 26 : #include <iostream> 27 : #include <iomanip> 28 : #include "SUMOTime.h" 29 : #include "StringTokenizer.h" 30 : #include "StringUtils.h" 31 : #include "StdDefs.h" 32 : #include "MsgHandler.h" 33 : 34 : 35 : // =========================================================================== 36 : // type definitions 37 : // =========================================================================== 38 : SUMOTime DELTA_T = 1000; 39 : 40 : 41 : // =========================================================================== 42 : // method definitions 43 : // =========================================================================== 44 : 45 : SUMOTime 46 12577188 : string2time(const std::string& r) { 47 12577188 : if (r.find(":") == std::string::npos) { 48 12576472 : const double time = StringUtils::toDouble(r); 49 12576223 : if (time > STEPS2TIME(SUMOTime_MAX)) { 50 12 : throw TimeFormatException("Input string '" + r + "' exceeds the time value range."); 51 : } 52 14244455 : return TIME2STEPS(time); 53 : } else { 54 : // try to parse jj:hh:mm:ss.s 55 2148 : std::vector<std::string> hrt = StringTokenizer(r, ":").getVector(); 56 716 : if (hrt.size() == 3) { 57 : //std::cout << "parsed '" << r << "' as " << (3600 * string2time(hrt[0]) + 60 * string2time(hrt[1]) + string2time(hrt[2])) << "\n"; 58 268 : return 3600 * string2time(hrt[0]) + 60 * string2time(hrt[1]) + string2time(hrt[2]); 59 448 : } else if (hrt.size() == 4) { 60 : //std::cout << "parsed '" << r << "' as " << (24 * 3600 * string2time(hrt[0]) + 3600 * string2time(hrt[1]) + 60 * string2time(hrt[2]) + string2time(hrt[3])) << "\n"; 61 448 : return 24 * 3600 * string2time(hrt[0]) + 3600 * string2time(hrt[1]) + 60 * string2time(hrt[2]) + string2time(hrt[3]); 62 : } 63 0 : throw TimeFormatException("Input string '" + r + "' is not a valid time format (jj:HH:MM:SS.S)."); 64 716 : } 65 : } 66 : 67 : 68 : std::string 69 11875550 : time2string(SUMOTime t, bool humanReadable) { 70 11875550 : std::ostringstream oss; 71 11875550 : if (t < 0) { 72 2037 : oss << "-"; 73 : } 74 : // needed for signed zero errors, see #5926 75 11875550 : t = llabs(t); 76 11875550 : const SUMOTime scale = (SUMOTime)pow(10, MAX2(0, 3 - gPrecision)); 77 11875550 : if (scale > 1 && t != SUMOTime_MAX) { 78 11864543 : t = (t + scale / 2) / scale; 79 : } 80 11875550 : const SUMOTime second = TIME2STEPS(1) / scale; 81 11875550 : if (humanReadable) { 82 721 : const SUMOTime minute = 60 * second; 83 721 : const SUMOTime hour = 60 * minute; 84 721 : const SUMOTime day = 24 * hour; 85 : // 123456 -> "00:00:12.34" 86 721 : if (t > day) { 87 50 : oss << t / day << ":"; 88 50 : t %= day; 89 : } 90 : oss << std::setfill('0') << std::setw(2); 91 721 : oss << t / hour << ":"; 92 721 : t %= hour; 93 721 : oss << std::setw(2) << t / minute << ":"; 94 721 : t %= minute; 95 721 : oss << std::setw(2) << t / second; 96 721 : t %= second; 97 721 : if (t != 0 || TS < 1.) { 98 20 : oss << "."; 99 20 : oss << std::setw(MIN2(3, gPrecision)); 100 : oss << t; 101 : } 102 : } else { 103 11874829 : oss << t / second << "."; 104 11874829 : oss << std::setfill('0') << std::setw(MIN2(3, gPrecision)); 105 11874829 : oss << t % second; 106 : } 107 11875550 : return oss.str(); 108 11875550 : } 109 : 110 : 111 : std::string 112 11875550 : time2string(SUMOTime t) { 113 11875550 : return time2string(t, gHumanReadableTime); 114 : } 115 : 116 : 117 : std::string 118 27355 : elapsedMs2string(long long int t) { 119 27355 : if (gHumanReadableTime) { 120 58 : if (STEPS2TIME(t) > 60) { 121 : // round to seconds 122 0 : return time2string((t / 1000) * 1000); 123 : } else { 124 116 : return toString((double)t / 1000.0) + "s"; 125 : } 126 : } else { 127 54594 : return time2string(t) + "s"; 128 : } 129 : } 130 : 131 55101 : bool checkStepLengthMultiple(const SUMOTime t, const std::string& error, SUMOTime deltaT, SUMOTime begin) { 132 55101 : if (begin % deltaT == 0) { 133 55089 : if (t % deltaT != 0) { 134 588 : WRITE_WARNING("The given time value " + time2string(t) + " is not a multiple of the step length " + time2string(deltaT) + error + ".") 135 : } 136 : } else { 137 12 : if ((t - begin) % deltaT != 0) { 138 12 : WRITE_WARNING("The given time value " + time2string(t) + " is not reached with step length " + time2string(deltaT) 139 : + " and begin time " + time2string(begin) + error + ".") 140 : } 141 : } 142 : // next line used to fix build 143 55101 : return false; 144 : } 145 : 146 : 147 : /****************************************************************************/