From dde6e42a3cec971aa5980ab723a50e38c32690ca Mon Sep 17 00:00:00 2001 From: Stefan Appelhoff Date: Thu, 23 Jul 2020 18:15:04 +0200 Subject: [PATCH] ENH: validate optional fractional seconds in acqTime --- .../validators/tsv/checkAcqTimeFormat.js | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/bids-validator/validators/tsv/checkAcqTimeFormat.js b/bids-validator/validators/tsv/checkAcqTimeFormat.js index 1ad57bab3..34786da48 100644 --- a/bids-validator/validators/tsv/checkAcqTimeFormat.js +++ b/bids-validator/validators/tsv/checkAcqTimeFormat.js @@ -2,17 +2,34 @@ const Issue = require('../../utils').issues.Issue import { isValid as dateIsValid, parse } from 'date-fns' const checkAcqTimeFormat = function(rows, file, issues) { - const format = "yyyy-MM-dd'T'HH:mm:ss" const header = rows[0] const acqTimeColumn = header.indexOf('acq_time') const testRows = rows.slice(1) testRows.map((line, i) => { + var format = "yyyy-MM-dd'T'HH:mm:ss" const lineValues = line const acqTime = lineValues[acqTimeColumn] - let isValid = dateIsValid(parse(acqTime, format, new Date())) - if (acqTime === 'n/a') { - isValid = true + // Try different date formats: We accept any amount of optional fractional + // seconds: .S, .SS, .SSS, .SSSS, .SSSSS, .SSSSSS + var isValid = false + for (i = 0; i < 7; i++) { + + isValid = dateIsValid(parse(acqTime, format, new Date())) + + // exit early if date is valid or n/a + if (acqTime === 'n/a' | isValid) { + isValid = true + break + } + + // If not valid, try again with parsing a new amount of fractional secs + if (i === 0) { + format += '.' + } + format += 'S' } + + // if the loop exits with !isValid, we need to raise an issue if (acqTime && !isValid) { issues.push( new Issue({