#158 fallback for weird timestamps

This commit is contained in:
Thibault Deckers 2022-01-18 11:36:18 +09:00
parent 81caf10ebc
commit ca991ae9dd
3 changed files with 26 additions and 33 deletions

View file

@ -349,20 +349,7 @@ class AvesEntry {
DateTime? _bestDate; DateTime? _bestDate;
DateTime? get bestDate { DateTime? get bestDate {
if (_bestDate == null) { _bestDate ??= dateTimeFromMillis(_catalogDateMillis) ?? dateTimeFromMillis(sourceDateTakenMillis) ?? dateTimeFromMillis((dateModifiedSecs ?? 0) * 1000);
try {
if ((_catalogDateMillis ?? 0) > 0) {
_bestDate = DateTime.fromMillisecondsSinceEpoch(_catalogDateMillis!);
} else if ((sourceDateTakenMillis ?? 0) > 0) {
_bestDate = DateTime.fromMillisecondsSinceEpoch(sourceDateTakenMillis!);
} else if ((dateModifiedSecs ?? 0) > 0) {
_bestDate = DateTime.fromMillisecondsSinceEpoch(dateModifiedSecs! * 1000);
}
} catch (e, stack) {
// date millis may be out of range
reportService.recordError(e, stack);
}
}
return _bestDate; return _bestDate;
} }

View file

@ -7,6 +7,7 @@ import 'package:aves/model/panorama.dart';
import 'package:aves/services/common/service_policy.dart'; import 'package:aves/services/common/service_policy.dart';
import 'package:aves/services/common/services.dart'; import 'package:aves/services/common/services.dart';
import 'package:aves/services/metadata/xmp.dart'; import 'package:aves/services/metadata/xmp.dart';
import 'package:aves/utils/time_utils.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -238,12 +239,7 @@ class PlatformMetadataFetchService implements MetadataFetchService {
'field': field.toExifInterfaceTag(), 'field': field.toExifInterfaceTag(),
}); });
if (result is int) { if (result is int) {
try { return dateTimeFromMillis(result, isUtc: false);
return DateTime.fromMillisecondsSinceEpoch(result);
} catch (e, stack) {
// date millis may be out of range
await reportService.recordError(e, stack);
}
} }
} on PlatformException catch (e, stack) { } on PlatformException catch (e, stack) {
if (!entry.isMissingAtPath) { if (!entry.isMissingAtPath) {

View file

@ -1,4 +1,4 @@
import 'package:aves/services/common/services.dart'; import 'package:flutter/foundation.dart';
extension ExtraDateTime on DateTime { extension ExtraDateTime on DateTime {
bool isAtSameYearAs(DateTime? other) => year == other?.year; bool isAtSameYearAs(DateTime? other) => year == other?.year;
@ -18,6 +18,26 @@ extension ExtraDateTime on DateTime {
final epoch = DateTime.fromMillisecondsSinceEpoch(0, isUtc: true); final epoch = DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
// Overflowing timestamps that are supposed to be in milliseconds
// will be retried after stripping extra digits.
const _millisMaxDigits = 13; // 13 digits can go up to 2286/11/20
DateTime? dateTimeFromMillis(int? millis, {bool isUtc = false}) {
if (millis == null || millis == 0) return null;
try {
return DateTime.fromMillisecondsSinceEpoch(millis, isUtc: isUtc);
} catch (e) {
// `DateTime`s can represent time values that are at a distance of at most 100,000,000
// days from epoch (1970-01-01 UTC): -271821-04-20 to 275760-09-13.
debugPrint('failed to build DateTime from timestamp in millis=$millis');
}
final digits = '$millis'.length;
if (digits > _millisMaxDigits) {
millis = int.tryParse('$millis'.substring(0, _millisMaxDigits));
return dateTimeFromMillis(millis, isUtc: isUtc);
}
}
final _unixStampMillisPattern = RegExp(r'\d{13}'); final _unixStampMillisPattern = RegExp(r'\d{13}');
final _unixStampSecPattern = RegExp(r'\d{10}'); final _unixStampSecPattern = RegExp(r'\d{10}');
final _plainPattern = RegExp(r'(\d{8})([_-\s](\d{6})([_-\s](\d{3}))?)?'); final _plainPattern = RegExp(r'(\d{8})([_-\s](\d{6})([_-\s](\d{3}))?)?');
@ -31,12 +51,7 @@ DateTime? parseUnknownDateFormat(String? s) {
if (stampMillisString != null) { if (stampMillisString != null) {
final stampMillis = int.tryParse(stampMillisString); final stampMillis = int.tryParse(stampMillisString);
if (stampMillis != null) { if (stampMillis != null) {
try { return dateTimeFromMillis(stampMillis, isUtc: false);
return DateTime.fromMillisecondsSinceEpoch(stampMillis, isUtc: false);
} catch (e, stack) {
// date millis may be out of range
reportService.recordError(e, stack);
}
} }
} }
} }
@ -47,12 +62,7 @@ DateTime? parseUnknownDateFormat(String? s) {
if (stampSecString != null) { if (stampSecString != null) {
final stampSec = int.tryParse(stampSecString); final stampSec = int.tryParse(stampSecString);
if (stampSec != null) { if (stampSec != null) {
try { return dateTimeFromMillis(stampSec * 1000, isUtc: false);
return DateTime.fromMillisecondsSinceEpoch(stampSec * 1000, isUtc: false);
} catch (e, stack) {
// date millis may be out of range
reportService.recordError(e, stack);
}
} }
} }
} }