; ; NOSA HEADER START ; ; The contents of this file are subject to the terms of the NASA Open ; Source Agreement (NOSA), Version 1.3 only (the "Agreement"). You may ; not use this file except in compliance with the Agreement. ; ; You can obtain a copy of the agreement at ; docs/NASA_Open_Source_Agreement_1.3.txt ; ; See the Agreement for the specific language governing permissions ; and limitations under the Agreement. ; ; When distributing Covered Code, include this NOSA HEADER in each ; file and include the Agreement file at ; docs/NASA_Open_Source_Agreement_1.3.txt. If applicable, add the ; following below this NOSA HEADER, with the fields enclosed by ; brackets "[]" replaced with your own identifying information: ; Portions Copyright [yyyy] [name of copyright owner] ; ; NOSA HEADER END ; ; Copyright (c) 2010-2024 United States Government as represented by the ; National Aeronautics and Space Administration. No copyright is claimed ; in the United States under Title 17, U.S.Code. All Other Rights Reserved. ; ;

;+ ; This class is an IDL representation of the TimeInterval element from ; the ; <a href=“https://cdaweb.gsfc.nasa.gov/“>Coordinated Data Analysis ; System</a> (CDAS) and ; <a href=“http://sscweb.gsfc.nasa.gov/“>Satellite Situation Center</a> ; (SSC) XML schemas. ; ; Notes: ; <ol> ; <li>This class exists in both the CDAS and SSC web service IDL ; libraries. They should be kept identical to void incompatiblities ; for clients that use both libraries simultaneously.</li> ; </ol> ; ; @copyright Copyright (c) 2010-2024 United States Government as ; represented by the National Aeronautics and Space Administration. ; No copyright is claimed in the United States under Title 17, ; U.S.Code. All Other Rights Reserved. ; ; @author B. Harris ;-

;+ ; Creates an SpdfTimeInterval object. ; ; @param start {in} {type=string/julday} ; start time of interval. Value may be either an ; <a href=“https://en.wikipedia.org/wiki/ISO_8601”> ; ISO 8601</a> date/time string or a julday value. ; @param stop {in} {type=string/julday} ; stop time of interval. Value may be either an ; <a href=“https://en.wikipedia.org/wiki/ISO_8601”> ; ISO 8601</a> date/time string or a julday value. ; @returns reference to an SpdfTimeInterval object. ;- function SpdfTimeInterval::init, $ start, stop compile_opt idl2

self.cdawebFormat = $
    '(I4, "/", I02, "/", I02, " ", I02, ":", I02, ":", I02)'

self.iso8601Format = $
    '(I4, "-", I02, "-", I02, "T", I02, ":", I02, ":", F06.3, "Z")'

self.shortIso8601Format = $
    '(I4, 1X, I2, 1X, I2, 1X, I2, 1X, I2, 1X, F06.3)'

self.basicIso8601Format = $
    '(I4, I02, I02, "T", I02, I02, I02, "Z")'

if (size(start, /type) eq 7) then begin

    self.start = self->getJulDayFromIso8601(start)
endif else begin

    self.start = start
endelse

if size(stop, /type) eq 7 then begin

    self.stop = self->getJulDayFromIso8601(stop)
endif else begin

    self.stop = stop
endelse

return, self

end

;+ ; Performs cleanup operations when this object is destroyed. ;- pro SpdfTimeInterval::cleanup compile_opt idl2

end

;+ ; Get the start value. ; ; @returns julday start value. ;- function SpdfTimeInterval::getStart compile_opt idl2

return, self.start

end

;+ ; Sets the start value. ; ; @param value {in} {type=julday} new value ;- pro SpdfTimeInterval::setStart, $ value compile_opt idl2

self.start = value

end

;+ ; Get the stop value. ; ; @returns julday stop value. ;- function SpdfTimeInterval::getStop compile_opt idl2

return, self.stop

end

;+ ; Sets the stop value. ; ; @param value {in} {type=julday} new value ;- pro SpdfTimeInterval::setStop, $ value compile_opt idl2

self.stop = value

end

;+ ; Converts the given ISO 8601 time value string into the ; corresponding julday value. ; ; @param value {in} {type=string} ; ISO 8601 date/time value ; @returns julday value corresponding to the given iso8601 value. ;- function SpdfTimeInterval::getJulDayFromIso8601, $ value compile_opt idl2 ; compile_opt static (idl 8.3) except for self.iso8601Format constant

iso8601 = value 

if strlen(value) eq 10 then begin

    iso8601 = value + ' 00:00:00'
endif 

reads, iso8601, format=self.shortIso8601Format, $
    year, month, day, hour, minute, second

return, julday(month, day, year, hour, minute, second)

end

;+ ; Converts the given julday value into the corresponding ISO 8601 ; time value string. ; ; @param value {in} {type=string} ; julday value. ; @keyword basicFormat {in} {optional} {type=boolean} {default=false} ; Indicates whether the “basic” (minimal field separators) ISO 8601 ; format is to be returned. ; @returns ISO 8601 date/time value corresponding to the given ; julday value. ;- function SpdfTimeInterval::getIso8601FromJulDay, value, value, basicFormat = basicFormat compile_opt idl2 ; compile_opt static (idl 8.3) except for self.iso8601Format constant

format = self.iso8601Format

if keyword_set(basicFormat) && basicFormat then begin

    format = self.basicIso8601Format
endif

caldat, value, month, day, year, hour, minute, second

return, string(year, month, day, hour, minute, second, $
               format=format)

end

;+ ; Get the start value. ; ; @keyword basicFormat {in} {optional} {type=boolean} {default=false} ; Indicates whether the “basic” (minimal field separators) ISO 8601 ; format is to be returned. ; @returns start value as an ISO 8601 string. ;- function SpdfTimeInterval::getIso8601Start, $ basicFormat = basicFormat compile_opt idl2

return, self->getIso8601FromJulDay(self.start, basicFormat=basicFormat)

end

;+ ; Get the stop value. ; ; @keyword basicFormat {in} {optional} {type=boolean} {default=false} ; Indicates whether the “basic” (minimal field separators) ISO 8601 ; format is to be returned. ; @returns stop value as an ISO 8601 string. ;- function SpdfTimeInterval::getIso8601Stop, $ basicFormat = basicFormat compile_opt idl2

return, self->getIso8601FromJulDay(self.stop, basicFormat=basicFormat)

end

;+ ; Get the start value. ; ; @returns start value as an cdaweb format string. ;- function SpdfTimeInterval::getCdawebStart compile_opt idl2

caldat, self.start, month, day, year, hour, minute, second

return, string(year, month, day, hour, minute, second, $
               format=self.cdawebFormat)

end

;+ ; Get the stop value. ; ; @returns stop value as an cdaweb format string. ;- function SpdfTimeInterval::getCdawebStop compile_opt idl2

caldat, self.stop, month, day, year, hour, minute, second

return, string(year, month, day, hour, minute, second, $
               format=self.cdawebFormat)

end

;+ ; Determines if the start time is less than the stop time. ; ; @returns true if the start time is less than the stop time. ; Otherwise false. ;- function SpdfTimeInterval::isStartLessThanStop compile_opt idl2

return, self.start lt self.stop

end

;+ ; Determines if this interval is larger than one day. ; ; @returns true if this interval is larger than one day. ; Otherwise false. ;- function SpdfTimeInterval::isGreaterThan1Day compile_opt idl2

return, (self.stop - self.start) gt 1

end

;+ ; Prints a textual representation of this object. ;- pro SpdfTimeInterval::print compile_opt idl2

print, 'TimeInterval: ', self->getIso8601Start(), ' to ', $
       self->getIso8601Stop()

end

;+ ; Creates a TimeInterval element using the given XML DOM document with the ; values of this object. ; ; @param doc {in} {type=IDLffXMLDOMDocument} ; document in which to create the TimeInterval element. ; @returns a reference to a new IDLffXMLDOMElement representation of ; this object. ;- function SpdfTimeInterval::createDomElement, $ doc compile_opt idl2

timeIntervalElement = doc->createElement('TimeInterval')
startElement = doc->createElement('Start')
ovoid = timeIntervalElement->appendChild(startElement)
startTextNode = doc->createTextNode(self->getIso8601Start())
ovoid = startElement->appendChild(startTextNode)
endElement = doc->createElement('End')
ovoid = timeIntervalElement->appendChild(endElement)
endTextNode = doc->createTextNode(self->getIso8601Stop())
ovoid = endElement->appendChild(endTextNode)

return, timeIntervalElement

end

;+ ; Defines the SpdfTimeInterval class. ; ; @field start julday start value of interval. ; @field stop julday stop value of interval. ; @field cdawebFormat constant format string for a “cdaweb” time format. ; @field iso8601Format constant format string for an ISO 8601 value. ; @field shortIso8601Format short version of a constant format string ; for an ISO 8601 value. ; @field basicIso8601Format constant format string for a “basic” (minimal ; field separators) ISO 8601 value. ;- pro SpdfTimeInterval__define compile_opt idl2 struct = { SpdfTimeInterval, start:0d, start:0d, stop:0d, cdawebFormat:, cdawebFormat:'', iso8601Format:”, shortIso8601Format:, shortIso8601Format:'', basicIso8601Format:” $ } end