mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 02:14:01 +00:00
fix(fires): reject rolled-over acquisition dates and document UTC times
This commit is contained in:
1 parent
5ae18032fc
commit
3de745bd33
4 files changed
+40
-2
No files matched your search
@@ -1,4 +1,6 @@
|
||||
- Report a fire detection's acquisition time as a UTC timestamp in
|
||||
`get_active_fires`. The tool joined FIRMS's unpadded date and time, so a
|
||||
00:45 UTC detection read "2026-01-01 45"; it now reads
|
||||
`2026-01-01T00:45:00.000Z` (Rudy Celekli, @rudycelekli, #1395).
|
||||
`2026-01-01T00:45:00.000Z`. Missing or invalid dates and times remain
|
||||
unknown rather than rolling into another calendar day
|
||||
(Rudy Celekli, @rudycelekli, #1395).
|
||||
@@ -1984,6 +1984,9 @@ accessible name remains "Don't show this again". Control behavior is unchanged.
|
||||
## FIRMS source status
|
||||
|
||||
The FIRMS CSV parser rejects impossible acquisition calendar dates before the proxy filters records to the trailing 24 hours, while retaining valid UTC acquisition times.
|
||||
The `get_active_fires` tool reports acquisition times as UTC ISO timestamps,
|
||||
including zero-padded hours and minutes; missing or invalid dates and times
|
||||
remain `null`, including impossible calendar dates from a custom source.
|
||||
|
||||
The FIRMS proxy records source success after appending its rows. If aggregation
|
||||
throws, that source reports failure without a contradictory success entry.
|
||||
|
||||
@@ -14,9 +14,13 @@ function acquiredMsUtc(acqDate, acqTime) {
|
||||
const hours = Number(hhmm.slice(0, 2));
|
||||
const minutes = Number(hhmm.slice(2, 4));
|
||||
if (hours > 23 || minutes > 59) return NaN;
|
||||
return Date.parse(
|
||||
const timestamp = Date.parse(
|
||||
`${acqDate}T${hhmm.slice(0, 2)}:${hhmm.slice(2, 4)}:00.000Z`,
|
||||
);
|
||||
return Number.isFinite(timestamp) &&
|
||||
new Date(timestamp).toISOString().slice(0, 10) === acqDate
|
||||
? timestamp
|
||||
: NaN;
|
||||
}
|
||||
|
||||
export const getEarthquakes = defineTool({
|
||||
|
||||
@@ -15,3 +15,32 @@ test('a fire acquired at 00:45 UTC reads as 00:45, not "45"', async () => {
|
||||
]).call('get_active_fires', { area: { bbox: [120, 23, 122, 25] } });
|
||||
assert.equal(result.data.rows[0].acquired, '2026-01-01T00:45:00.000Z');
|
||||
});
|
||||
|
||||
test('fire acquisition timestamps reject impossible calendar dates', async () => {
|
||||
for (const acqDate of [
|
||||
'2026-02-29',
|
||||
'2026-02-30',
|
||||
'2026-04-31',
|
||||
'1900-02-29',
|
||||
'2026-13-01',
|
||||
'2026-01-00',
|
||||
]) {
|
||||
const result = await catalogWith([
|
||||
{ lat: 24, lon: 121, acqDate, acqTime: '45' },
|
||||
]).call('get_active_fires', { area: { bbox: [120, 23, 122, 25] } });
|
||||
assert.equal(result.data.rows[0].acquired, null, acqDate);
|
||||
}
|
||||
});
|
||||
|
||||
test('fire acquisition timestamps preserve valid leap days and UTC times', async () => {
|
||||
for (const [acqDate, acqTime, expected] of [
|
||||
['2024-02-29', '45', '2024-02-29T00:45:00.000Z'],
|
||||
['2000-02-29', 0, '2000-02-29T00:00:00.000Z'],
|
||||
['2026-04-30', '2359', '2026-04-30T23:59:00.000Z'],
|
||||
]) {
|
||||
const result = await catalogWith([
|
||||
{ lat: 24, lon: 121, acqDate, acqTime },
|
||||
]).call('get_active_fires', { area: { bbox: [120, 23, 122, 25] } });
|
||||
assert.equal(result.data.rows[0].acquired, expected);
|
||||
}
|
||||
});
|
||||
Reference in new issue
Block a user