2026-07-05 06:41:32 +00:00
import toDate from "../toDate/index.js" ;
import isValid from "../isValid/index.js" ;
import addLeadingZeros from "../_lib/addLeadingZeros/index.js" ;
/**
* @name formatISO9075
* @category Common Helpers
* @summary Format the date according to the ISO 9075 standard (https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_get-format).
*
* @description
* Return the formatted date string in ISO 9075 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.
* @param {'complete'|'date'|'time'} [options.representation='complete'] - format date, time, or both.
* @returns {String} the formatted date string
* @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
* // Represent 18 September 2019 in ISO 9075 format:
* const result = formatISO9075(new Date(2019, 8, 18, 19, 0, 52))
* //=> '2019-09-18 19:00:52'
*
* @example
* // Represent 18 September 2019 in ISO 9075, short format:
* const result = formatISO9075(new Date(2019, 8, 18, 19, 0, 52), { format: 'basic' })
* //=> '20190918 190052'
*
* @example
* // Represent 18 September 2019 in ISO 9075 format, date only:
* const result = formatISO9075(new Date(2019, 8, 18, 19, 0, 52), { representation: 'date' })
* //=> '2019-09-18'
*
* @example
* // Represent 18 September 2019 in ISO 9075 format, time only:
* const result = formatISO9075(new Date(2019, 8, 18, 19, 0, 52), { representation: 'time' })
* //=> '19:00:52'
*/
2026-07-07 07:11:50 +00:00
export default function formatISO9075 ( dirtyDate , dirtyOptions ) {
2026-07-05 06:41:32 +00:00
if ( arguments . length < 1 ) {
throw new TypeError ( "1 argument required, but only " . concat ( arguments . length , " present" ) ) ;
}
2026-07-07 07:11:50 +00:00
2026-07-05 06:41:32 +00:00
var originalDate = toDate ( dirtyDate ) ;
2026-07-07 07:11:50 +00:00
2026-07-05 06:41:32 +00:00
if ( ! isValid ( originalDate ) ) {
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 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' ) {
var day = addLeadingZeros ( originalDate . getDate ( ) , 2 ) ;
var month = addLeadingZeros ( originalDate . getMonth ( ) + 1 , 2 ) ;
2026-07-07 07:11:50 +00:00
var year = addLeadingZeros ( 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' ) {
var hour = addLeadingZeros ( originalDate . getHours ( ) , 2 ) ;
var minute = addLeadingZeros ( originalDate . getMinutes ( ) , 2 ) ;
2026-07-07 07:11:50 +00:00
var second = addLeadingZeros ( originalDate . getSeconds ( ) , 2 ) ; // If there's also date, separate it with time with a space
2026-07-05 06:41:32 +00:00
2026-07-07 07:11:50 +00:00
var separator = result === '' ? '' : ' ' ; // HHmmss or HH:mm:ss.
2026-07-05 06:41:32 +00:00
result = "" . concat ( result ) . concat ( separator ) . concat ( hour ) . concat ( timeDelimiter ) . concat ( minute ) . concat ( timeDelimiter ) . concat ( second ) ;
}
2026-07-07 07:11:50 +00:00
2026-07-05 06:41:32 +00:00
return result ;
}