XIRef<XTimeZone> XSimpleTimeZone::FromXML(XIRef<XDomParserNode> node) { const XString utcOffsetStr = node->GetMetaData("utcOffset"); const XString dstOffsetStr = node->GetMetaData("dstOffset"); if(node->GetTagName() != "XSimpleTimeZone" || utcOffsetStr.empty() || (!verifyDigit(utcOffsetStr[0]) && utcOffsetStr[0] != '-') || count_if(utcOffsetStr.begin() + 1, utcOffsetStr.end(), verifyDigit) != (int)utcOffsetStr.size() - 1 || dstOffsetStr.empty() || (!verifyDigit(dstOffsetStr[0]) && dstOffsetStr[0] != '-') || count_if(dstOffsetStr.begin() + 1, dstOffsetStr.end(), verifyDigit) != (int)dstOffsetStr.size() - 1) { return 0; } const int utcOffset = utcOffsetStr.ToInt(); const int dstOffset = dstOffsetStr.ToInt(); return new XSimpleTimeZone(utcOffset, dstOffset); }
XIRef<XTimeZone> XSimpleTimeZone::FromISOString(const XString& isoString) { if(isoString[0] != '-' && isoString[0] != '+') X_THROW(("Invalid ISO Extended String: %s", isoString.c_str())); const int sign = isoString[0] == '-' ? -1 : 1; const XString str = isoString.substr(1); if(str.empty()) X_THROW(("Invalid ISO Extended String: %s", isoString.c_str())); const size_t colonDex = str.find(':'); XString hoursStr; XString minutesStr; if(colonDex != string::npos) { hoursStr = str.substr(0, colonDex); minutesStr = str.substr(colonDex + 1); if(minutesStr.size() != 2) X_THROW(("Invalid ISO Extended String: %s", isoString.c_str())); } else hoursStr = str; if(count_if(hoursStr.begin(), hoursStr.end(), verifyDigit) != (int)hoursStr.size() || count_if(minutesStr.begin(), minutesStr.end(), verifyDigit) != (int)minutesStr.size()) { X_THROW(("Invalid ISO Extended String: %s", isoString.c_str())); } const int hours = hoursStr.ToInt(); const int minutes = minutesStr.empty() ? 0 : minutesStr.ToInt(); return new XSimpleTimeZone(sign * (int)(convert(HOURS, MINUTES, hours) + minutes)); }