95 lines
2.3 KiB
Dart
95 lines
2.3 KiB
Dart
|
import 'package:timezone/timezone.dart' as tz;
|
||
|
|
||
|
enum UiTimeZoneType {
|
||
|
ro,
|
||
|
local,
|
||
|
utc,
|
||
|
iana,
|
||
|
}
|
||
|
|
||
|
extension UITimeZoneTypeName on UiTimeZoneType {
|
||
|
String get userInterfaceName => (const {
|
||
|
UiTimeZoneType.iana: 'Fus orar IANA',
|
||
|
UiTimeZoneType.local: 'Local',
|
||
|
UiTimeZoneType.ro: 'România',
|
||
|
UiTimeZoneType.utc: 'UTC',
|
||
|
})[this]!;
|
||
|
}
|
||
|
|
||
|
const Map<UiTimeZoneType, UiTimeZone Function(String)> fromSerStringConstructors = {
|
||
|
UiTimeZoneType.ro: RoUiTimeZone.fromSerString,
|
||
|
UiTimeZoneType.local: LocalUiTimeZone.fromSerString,
|
||
|
UiTimeZoneType.utc: UtcUiTimeZone.fromSerString,
|
||
|
UiTimeZoneType.iana: IanaUiTimeZone.fromSerString,
|
||
|
};
|
||
|
|
||
|
abstract class UiTimeZone {
|
||
|
final UiTimeZoneType type;
|
||
|
|
||
|
const UiTimeZone({required this.type});
|
||
|
|
||
|
DateTime convertDateTime(DateTime dt);
|
||
|
|
||
|
factory UiTimeZone.fromSerString(String ser) {
|
||
|
final arr = ser.split('\n');
|
||
|
return fromSerStringConstructors.map((key, value) => MapEntry(key.name, value))[arr[0]]!(ser);
|
||
|
}
|
||
|
|
||
|
String toSerString() {
|
||
|
return '${type.name}\n';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class RoUiTimeZone extends UiTimeZone {
|
||
|
static final roTz = tz.getLocation('Europe/Bucharest');
|
||
|
|
||
|
const RoUiTimeZone() : super(type: UiTimeZoneType.ro);
|
||
|
|
||
|
factory RoUiTimeZone.fromSerString(String ser) => const RoUiTimeZone();
|
||
|
|
||
|
@override
|
||
|
DateTime convertDateTime(DateTime dt) {
|
||
|
return tz.TZDateTime.from(dt, roTz);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class LocalUiTimeZone extends UiTimeZone {
|
||
|
const LocalUiTimeZone() : super(type: UiTimeZoneType.local);
|
||
|
|
||
|
factory LocalUiTimeZone.fromSerString(String ser) => LocalUiTimeZone();
|
||
|
|
||
|
@override
|
||
|
DateTime convertDateTime(DateTime dt) => dt.toLocal();
|
||
|
}
|
||
|
|
||
|
class UtcUiTimeZone extends UiTimeZone {
|
||
|
const UtcUiTimeZone() : super(type: UiTimeZoneType.utc);
|
||
|
|
||
|
factory UtcUiTimeZone.fromSerString(String ser) => UtcUiTimeZone();
|
||
|
|
||
|
@override
|
||
|
DateTime convertDateTime(DateTime dt) => dt.toUtc();
|
||
|
}
|
||
|
|
||
|
class IanaUiTimeZone extends UiTimeZone {
|
||
|
late final tz.Location location;
|
||
|
|
||
|
IanaUiTimeZone({required String ianaName}): super(type: UiTimeZoneType.iana) {
|
||
|
location = tz.getLocation(ianaName);
|
||
|
}
|
||
|
|
||
|
factory IanaUiTimeZone.fromSerString(String ser) => IanaUiTimeZone(
|
||
|
ianaName: ser.split('\n').skip(1).join('\n'),
|
||
|
);
|
||
|
|
||
|
@override
|
||
|
DateTime convertDateTime(DateTime dt) {
|
||
|
return tz.TZDateTime.from(dt, location);
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
String toSerString() {
|
||
|
return '${type.name}\n${location.name}';
|
||
|
}
|
||
|
}
|