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