For ways to create and not create an Iso8601DateTime, look at the following package:
package DateTimeAttributeTest {
public import ScalarValues::*;
public import Time::*;
// --- BAD: string literal passed directly to Iso8601DateTime constructor.
// Produces: ScalarValues::String does not conform to Time::Iso8601DateTimeEncoding
attribute badBirth : Iso8601DateTime = new Iso8601DateTime("1926-04-03T00:00:00Z");
// --- CANDIDATE A: wrap the string in an Iso8601DateTimeEncoding constructor,
// then pass positionally to Iso8601DateTime.
attribute candidateA : Iso8601DateTime = new Iso8601DateTime(
new Iso8601DateTimeEncoding("1926-04-03T00:00:00Z")
);
// --- CANDIDATE B: redefine `val` inline using :>>.
attribute candidateB : Iso8601DateTime {
:>> val = new Iso8601DateTimeEncoding("1926-04-03T00:00:00Z");
}
// --- CANDIDATE C: bare string in :>> binding also fails.
// Iso8601DateTimeEncoding :> String means Iso8601DateTimeEncoding is a subtype of String,
// so a String literal is not assignable to Iso8601DateTimeEncoding regardless of binding context.
attribute candidateC : Iso8601DateTime {
:>> val = "1926-04-03T00:00:00Z";
}
}