You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.3 KiB
94 lines
2.3 KiB
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}'; |
|
} |
|
}
|
|
|