mirror of
https://github.com/immich-app/immich.git
synced 2025-12-05 20:40:29 -08:00
* fixed the timezone issue in the Immich mobile app's metadata sheet to match the web app's behavior * format dart * now uses the shared applyTimezoneOffset() utility function from mobile/lib/utils/timezone.dart * add tests --------- Co-authored-by: Alex <alex.tran1502@gmail.com>
36 lines
1.2 KiB
Dart
36 lines
1.2 KiB
Dart
import 'package:timezone/timezone.dart';
|
|
|
|
/// Applies timezone conversion to a DateTime using EXIF timezone information.
|
|
///
|
|
/// This function handles two timezone formats:
|
|
/// 1. Named timezone locations (e.g., "Asia/Hong_Kong")
|
|
/// 2. UTC offset format (e.g., "UTC+08:00", "UTC-05:00")
|
|
///
|
|
/// Returns a tuple of (adjusted DateTime, timezone offset Duration)
|
|
(DateTime, Duration) applyTimezoneOffset({required DateTime dateTime, required String? timeZone}) {
|
|
DateTime dt = dateTime.toUtc();
|
|
|
|
if (timeZone == null) {
|
|
return (dt, dt.timeZoneOffset);
|
|
}
|
|
|
|
try {
|
|
// Try to get timezone location from database
|
|
final location = getLocation(timeZone);
|
|
dt = TZDateTime.from(dt, location);
|
|
return (dt, dt.timeZoneOffset);
|
|
} on LocationNotFoundException {
|
|
// Handle UTC offset format (e.g., "UTC+08:00")
|
|
RegExp re = RegExp(r'^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$', caseSensitive: false);
|
|
final m = re.firstMatch(timeZone);
|
|
if (m != null) {
|
|
final duration = Duration(hours: int.parse(m.group(1) ?? '0'), minutes: int.parse(m.group(2) ?? '0'));
|
|
dt = dt.add(duration);
|
|
return (dt, duration);
|
|
}
|
|
}
|
|
|
|
// If timezone is invalid, return UTC
|
|
return (dt, dt.timeZoneOffset);
|
|
}
|