/** * Produces a timestamp in the format YYYY-MM-DDTHH:MM:SS[Z|[+|-]hh:mm] * @param dest Destination to write the timestamp string * @param maxSize Maximum size of the destination, at least TIMESTAMP_STAMP_SIZE * @return The size of the timestamp string */ int getTimestamp(char *dest, int maxSize) { time_t epochTime = time(NULL); struct tm *currentTime; int offset = 0; if(maxSize < TIMESTAMP_STAMP_SIZE) { return FAIL; } currentTime = localtime(&epochTime); offset = strftime(dest, maxSize, "%Y-%m-%dT%H:%M:%S", currentTime); getTimezone(dest + offset, maxSize - offset); return strlen(dest); }
std::string terrama2::core::DataStoragerTiff::replaceMask(const std::string& mask, std::shared_ptr<te::dt::DateTime> timestamp, terrama2::core::DataSetPtr dataSet) const { if(!timestamp.get()) return mask; long year = 0; long month = 0; long day = 0; long hour = 0; long minutes = 0; long seconds = 0; if(timestamp->getDateTimeType() == te::dt::TIME_INSTANT) { auto dateTime = std::dynamic_pointer_cast<te::dt::TimeInstant>(timestamp); //invalid date type if(dateTime->getTimeInstant().is_not_a_date_time()) return mask; auto date = dateTime->getDate(); year = date.getYear(); month = date.getMonth().as_number(); day = date.getDay().as_number(); auto time = dateTime->getTime(); hour = time.getHours(); minutes = time.getMinutes(); seconds = time.getSeconds(); } else if(timestamp->getDateTimeType() == te::dt::TIME_INSTANT_TZ) { auto dateTime = std::dynamic_pointer_cast<te::dt::TimeInstantTZ>(timestamp); auto boostLocalTime = dateTime->getTimeInstantTZ(); //invalid date type if(boostLocalTime.is_not_a_date_time()) return mask; std::string timezone; try { //get dataset timezone timezone = getTimezone(dataSet); } catch(const terrama2::core::UndefinedTagException&) { //if no timezone is set use UTC timezone = "UTC+00"; } boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone(timezone)); auto localTime = boostLocalTime.local_time_in(zone); auto date = localTime.date(); year = date.year(); month = date.month().as_number(); day = date.day(); auto time = localTime.time_of_day(); hour = time.hours(); minutes = time.minutes(); seconds = time.seconds(); } else { //This method expects a valid Date/Time, other formats are not valid. QString errMsg = QObject::tr("Unknown date format."); TERRAMA2_LOG_ERROR() << errMsg; throw terrama2::core::DataAccessorException() << ErrorDescription(errMsg); } //replace wildcards in mask std::string fileName = mask; size_t pos = fileName.find("yyyy"); if(pos != std::string::npos) fileName.replace(pos, 4, zeroPadNumber(year, 4)); pos = fileName.find("yy"); if(pos != std::string::npos) fileName.replace(pos, 2, zeroPadNumber(year, 2)); pos = fileName.find("MM"); if(pos != std::string::npos) fileName.replace(pos, 2, zeroPadNumber(month, 2)); pos = fileName.find("dd"); if(pos != std::string::npos) fileName.replace(pos, 2, zeroPadNumber(day, 2)); pos = fileName.find("hh"); if(pos != std::string::npos) fileName.replace(pos, 2, zeroPadNumber(hour, 2)); pos = fileName.find("mm"); if(pos != std::string::npos) fileName.replace(pos, 2, zeroPadNumber(minutes, 2)); pos = fileName.find("ss"); if(pos != std::string::npos) fileName.replace(pos, 2, zeroPadNumber(seconds, 2)); //if no extension in the mask, add extension pos = fileName.find(".tif"); if(pos != std::string::npos) fileName += ".tif"; return fileName; }