Kenneth Bruen
2 years ago
16 changed files with 293 additions and 48 deletions
@ -0,0 +1,94 @@
|
||||
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}'; |
||||
} |
||||
} |
Loading…
Reference in new issue