in daffodil-lib/src/main/scala/org/apache/daffodil/lib/calendar/DFDLCalendarConversion.scala [217:274]
def timeZonePartFromXMLString(string: String, calendar: Calendar): String = {
@inline
def invalidValue = throw new IllegalArgumentException(
"Invalid time zone string: %s".format(string)
)
if (string == "") {
// no timezone
string
} else {
val firstChar = string.charAt(0)
val (timezone, endTimeZone) =
if (firstChar == 'Z') {
(TimeZone.GMT_ZONE, 1)
} else {
val sign =
if (firstChar == '+') 1
else if (firstChar == '-') -1
else invalidValue
if (string.length < 6) invalidValue
if (string.charAt(3) != ':') invalidValue
val h = string.substring(1, 3)
val m = string.substring(4, 6)
val s =
if (string.length > 6) {
if (string.charAt(6) != ':') invalidValue
string.substring(7, 9)
} else {
"00"
}
val offsetInMillis =
try {
val hi = Integer.parseInt(h)
val mi = Integer.parseInt(m)
val si = Integer.parseInt(s)
if (hi < 0 || hi >= 24) invalidValue
if (mi < 0 || mi >= 60) invalidValue
if (si < 0 || si >= 60) invalidValue
sign * (hi * 60 * 60 + mi * 60 + si) * 1000
} catch {
case _: NumberFormatException => invalidValue
}
val tz =
if (offsetInMillis == 0) TimeZone.GMT_ZONE
else new SimpleTimeZone(offsetInMillis, string)
val consumed = if (string.length > 6) 9 else 6
(tz, consumed)
}
calendar.setTimeZone(timezone)
string.substring(endTimeZone)
}
}