def timeZonePartFromXMLString()

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)
    }
  }