Site icon Flutter Packages | Pub dev Packages – Flutter Mobile App World

The Dart Time Machine is a date and time library

logo-dtm

The Dart Time Machine is a date and time library for Flutter, Web, and Server with support for timezones, calendars, cultures, formatting and parsing.

Time Machine provides an alternative date and time API over Dart Core. For comparision:

Dart Core API

Time Machine API

Time Machine’s Goals

The last two/three? are generic library goals.

Time Machine is a port of Noda Time; use it for all your .NET needs.

Current TZDB Version: 2020d

Example Code:

// Sets up timezone and culture information
await TimeMachine.initialize();
print('Hello, ${DateTimeZone.local} from the Dart Time Machine!\n');

var tzdb = await DateTimeZoneProviders.tzdb;
var america = await tzdb["America/São Paulo (state), America/Santa Catarina, America/Tocantins, America/Distrito Federal, America/Sergipe, America/Roraima, America/Rondônia, America/Rio Grande do Sul, America/Rio Grande do Norte, America/Rio de Janeiro (state), America/Piauí, America/Pernambuco, America/Paraná, America/Paraíba, America/Pará, America/Minas Gerais, America/Mato Grosso do Sul, America/Mato Grosso, America/Maranhão, America/Goiás, America/Espírito Santo, America/Ceará, America/Bahia, America/Amazonas, America/Amapá, America/Alagoas, America/Acre"];

var now = Instant.now();

print('Basic');
print('GMT Time: $now');
print('Local Time: ${now.inLocalZone()}');
print('Brazil Time: ${now.inZone(brazil)}\n');

print('Formatted');
print('GMT Time: ${now.toString('0707 2007-07-07 06:00')}');
print('Local Time: ${now.inLocalZone().toString('0707 2007-07-07 06:00')}\n');

var brazil = await Cultures.getCulture('pt-br');
print('Formatted and Brazil ($brazil)');
print('GMT Time: ${now.toString('0707 2007-07-07 06:00', brazil)}');
print('Local Time: ${now.inLocalZone().toString('0707 2007-07-07 06:00', brazil)}\n');

print('Parse Brazil Formatted ZonedDateTime');

// without the 'z' parsing will be forced to interpret the timezone as GMT
var localText = now
    .inLocalZone()
    .toString('1011 2021-10-11 06:00 z', brazil);

var localClone = ZonedDateTimePattern
    .createWithCulture('0707 2007-07-07 06:00 z', brazil)
    .parse(localText);
print(localClone.value);

VM

Flutter

Web (Dart2JS and DDC)

All unit tests pass on DartVM and DartWeb (just Chrome at this time). Tests have been run on preview versions of Dart2, but the focus is on DartStable, and they are not run before every pub publish. The public API is stabilizing — mostly focusing on taking C# idiomatic code and making it Dart idiomatic code, so I wouldn’t expect any over zealous changes. This is a preview release — but, I’d feel comfortable using it. (Author Stamp of Approval!)

Documentation was ported, but some things changed for Dart and the documentation is being slowly updated (and we need an additional automated formatting pass).

Don’t use any functions annotated with @internal. As of v0.3 you should not find any, but if you do, let me know.

Todo (before v1):

External data: Timezones (TZDB via Noda Time) and Culture (ICU via BCL) are produced by a C# tool that is not included in this repository. The goal is to port all this functionality to Dart, the initial tool was created for bootstrapping — and guaranteeing that our data is exactly the same thing that Noda Time would see (to ease porting).

Future Todo:

Flutter Specific Notes

You’ll need this entry in your pubspec.yaml.

# The following section is specific to Flutter.
flutter:
  assets:
    - packages/time_machine/data/cultures/cultures.bin
    - packages/time_machine/data/tzdb/tzdb.bin

Your initialization function will look like this:

import 'package:flutter/services.dart';

// TimeMachine discovers your TimeZone heuristically (it's actually pretty fast).
await TimeMachine.initialize({'rootBundle': rootBundle});

Once flutter gets Isolate.resolvePackageUri functionality, we’ll be able to merge VM and the Flutter code paths and no asset entry and no special import will be required. It would look just like the VM example.

Or with: https://pub.dartlang.org/packages/flutter_native_timezone

import 'package:flutter/services.dart';

// you can get Timezone information directly from the native interface with flutter_native_timezone
await TimeMachine.initialize({
  'rootBundle': rootBundle,
  'timeZone': await Timezone.getLocalTimezone(),
});

DDC Specific Notes

toString on many of the classes will not propagate patternText and culture parameters. Instant and ZonedDateTime currently have toStringDDC functions available to remedy this.

This also works:

dynamic foo = new Foo();
var foo = new Foo() as dynamic;
(foo as dynamic).toString(patternText, culture);

We learned in Issue:33876 that dynamic code uses a different flow path. Wrapping your code as dynamic will allow toString() to work normally. It will unfortunately ruin your intellisense.

See Issue:33876 for more information. The fix exists, now we just wait for it to hit a live build.

toStringDDC instead of toStringFormatted to attempt to get a negative contagion coefficient. If you are writing on DartStable today and you need some extra string support because of this bug, let me know.

Update: Dart 2.0 stable did not launch with the fix. Stable release windows are 6 weeks. Hopefully we get the fix in the next release (second half of September).

Download this time machine library source code on GitHub

https://github.com/Davidlucas66/time_machine_3

Exit mobile version