2026-07-05 06:41:32 +00:00
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . default = formatISO ;
2026-07-07 07:11:50 +00:00
2026-07-05 06:41:32 +00:00
var _index = _interopRequireDefault ( require ( "../toDate/index.js" ) ) ;
2026-07-07 07:11:50 +00:00
var _index2 = _interopRequireDefault ( require ( "../isValid/index.js" ) ) ;
var _index3 = _interopRequireDefault ( require ( "../_lib/addLeadingZeros/index.js" ) ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { default : obj } ; }
2026-07-05 06:41:32 +00:00
/**
* @name formatISO
* @category Common Helpers
2026-07-07 07:11:50 +00:00
* @summary Format the date according to the ISO 8601 standard (http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003169814.htm).
2026-07-05 06:41:32 +00:00
*
* @description
* Return the formatted date string in ISO 8601 format. Options may be passed to control the parts and notations of the date.
*
* @param {Date|Number} date - the original date
* @param {Object} [options] - an object with options.
* @param {'extended'|'basic'} [options.format='extended'] - if 'basic', hide delimiters between date and time values.
2026-07-07 07:11:50 +00:00
* @param {'complete'|'date'|'time'} [options.representation='complete'] - format date, time with time zone, or both.
* @returns {String} the formatted date string
2026-07-05 06:41:32 +00:00
* @throws {TypeError} 1 argument required
* @throws {RangeError} `date` must not be Invalid Date
* @throws {RangeError} `options.format` must be 'extended' or 'basic'
2026-07-07 07:11:50 +00:00
* @throws {RangeError} `options.represenation` must be 'date', 'time' or 'complete'
2026-07-05 06:41:32 +00:00
*
* @example
2026-07-07 07:11:50 +00:00
* // Represent 18 September 2019 in ISO 8601 format (UTC):
2026-07-05 06:41:32 +00:00
* const result = formatISO(new Date(2019, 8, 18, 19, 0, 52))
* //=> '2019-09-18T19:00:52Z'
*
* @example
2026-07-07 07:11:50 +00:00
* // Represent 18 September 2019 in ISO 8601, short format (UTC):
2026-07-05 06:41:32 +00:00
* const result = formatISO(new Date(2019, 8, 18, 19, 0, 52), { format: 'basic' })
* //=> '20190918T190052'
*
* @example
* // Represent 18 September 2019 in ISO 8601 format, date only:
* const result = formatISO(new Date(2019, 8, 18, 19, 0, 52), { representation: 'date' })
* //=> '2019-09-18'
*
* @example
2026-07-07 07:11:50 +00:00
* // Represent 18 September 2019 in ISO 8601 format, time only (UTC):
2026-07-05 06:41:32 +00:00
* const result = formatISO(new Date(2019, 8, 18, 19, 0, 52), { representation: 'time' })
* //=> '19:00:52Z'
*/
2026-07-07 07:11:50 +00:00
function formatISO ( dirtyDate , dirtyOptions ) {
if ( arguments . length < 1 ) {
throw new TypeError ( "1 argument required, but only " . concat ( arguments . length , " present" ) ) ;
}
var originalDate = ( 0 , _index . default ) ( dirtyDate ) ;
if ( ! ( 0 , _index2 . default ) ( originalDate ) ) {
2026-07-05 06:41:32 +00:00
throw new RangeError ( 'Invalid time value' ) ;
}
2026-07-07 07:11:50 +00:00
var options = dirtyOptions || { } ;
var format = options . format == null ? 'extended' : String ( options . format ) ;
var representation = options . representation == null ? 'complete' : String ( options . representation ) ;
2026-07-05 06:41:32 +00:00
if ( format !== 'extended' && format !== 'basic' ) {
throw new RangeError ( "format must be 'extended' or 'basic'" ) ;
}
2026-07-07 07:11:50 +00:00
2026-07-05 06:41:32 +00:00
if ( representation !== 'date' && representation !== 'time' && representation !== 'complete' ) {
throw new RangeError ( "representation must be 'date', 'time', or 'complete'" ) ;
}
2026-07-07 07:11:50 +00:00
2026-07-05 06:41:32 +00:00
var result = '' ;
var tzOffset = '' ;
var dateDelimiter = format === 'extended' ? '-' : '' ;
2026-07-07 07:11:50 +00:00
var timeDelimiter = format === 'extended' ? ':' : '' ; // Representation is either 'date' or 'complete'
2026-07-05 06:41:32 +00:00
if ( representation !== 'time' ) {
2026-07-07 07:11:50 +00:00
var day = ( 0 , _index3 . default ) ( originalDate . getDate ( ) , 2 ) ;
var month = ( 0 , _index3 . default ) ( originalDate . getMonth ( ) + 1 , 2 ) ;
var year = ( 0 , _index3 . default ) ( originalDate . getFullYear ( ) , 4 ) ; // yyyyMMdd or yyyy-MM-dd.
2026-07-05 06:41:32 +00:00
result = "" . concat ( year ) . concat ( dateDelimiter ) . concat ( month ) . concat ( dateDelimiter ) . concat ( day ) ;
2026-07-07 07:11:50 +00:00
} // Representation is either 'time' or 'complete'
2026-07-05 06:41:32 +00:00
if ( representation !== 'date' ) {
// Add the timezone.
var offset = originalDate . getTimezoneOffset ( ) ;
2026-07-07 07:11:50 +00:00
2026-07-05 06:41:32 +00:00
if ( offset !== 0 ) {
var absoluteOffset = Math . abs ( offset ) ;
2026-07-07 07:11:50 +00:00
var hourOffset = ( 0 , _index3 . default ) ( Math . floor ( absoluteOffset / 60 ) , 2 ) ;
var minuteOffset = ( 0 , _index3 . default ) ( absoluteOffset % 60 , 2 ) ; // If less than 0, the sign is +, because it is ahead of time.
2026-07-05 06:41:32 +00:00
var sign = offset < 0 ? '+' : '-' ;
tzOffset = "" . concat ( sign ) . concat ( hourOffset , ":" ) . concat ( minuteOffset ) ;
} else {
tzOffset = 'Z' ;
}
2026-07-07 07:11:50 +00:00
var hour = ( 0 , _index3 . default ) ( originalDate . getHours ( ) , 2 ) ;
var minute = ( 0 , _index3 . default ) ( originalDate . getMinutes ( ) , 2 ) ;
var second = ( 0 , _index3 . default ) ( originalDate . getSeconds ( ) , 2 ) ; // If there's also date, separate it with time with 'T'
var separator = result === '' ? '' : 'T' ; // Creates a time string consisting of hour, minute, and second, separated by delimiters, if defined.
2026-07-05 06:41:32 +00:00
2026-07-07 07:11:50 +00:00
var time = [ hour , minute , second ] . join ( timeDelimiter ) ; // HHmmss or HH:mm:ss.
2026-07-05 06:41:32 +00:00
result = "" . concat ( result ) . concat ( separator ) . concat ( time ) . concat ( tzOffset ) ;
}
2026-07-07 07:11:50 +00:00
2026-07-05 06:41:32 +00:00
return result ;
}
2026-07-07 07:11:50 +00:00
2026-07-05 06:41:32 +00:00
module . exports = exports . default ;