IntelligentPlant.Relativity
2.0.0
dotnet add package IntelligentPlant.Relativity --version 2.0.0
NuGet\Install-Package IntelligentPlant.Relativity -Version 2.0.0
<PackageReference Include="IntelligentPlant.Relativity" Version="2.0.0" />
paket add IntelligentPlant.Relativity --version 2.0.0
#r "nuget: IntelligentPlant.Relativity, 2.0.0"
// Install IntelligentPlant.Relativity as a Cake Addin #addin nuget:?package=IntelligentPlant.Relativity&version=2.0.0 // Install IntelligentPlant.Relativity as a Cake Tool #tool nuget:?package=IntelligentPlant.Relativity&version=2.0.0
IntelligentPlant.Relativity
A C# library for converting absolute and relative timestamp strings into UTC DateTime
instances, and duration strings into TimeSpan
instances.
Getting Started
The IRelativityParser
interface defines a parser that can be used to convert relative timestamps and durations into absolute DateTime
and TimeSpan
instances.
Ain IRelativityParser
parses timestamps and durations using a given CultureInfo
and TimeZoneInfo
. The CultureInfo
controls how absolute timestamps and TimeSpan
literals are parsed, as well as providing keywords that define the base times and time periods that can be used when defining relative timestamps or durations. The TimeZoneInfo
controls the time zone that is used when converting relative timestamps to absolute timestamps.
The static RelativityParser
class provides quick access to several built-in parsers:
RelativityParser.Invariant
- a parser that usesCultureInfo.InvariantCulture
and the system's local time zone when converting relative timestamps to absolute timestamps.RelativityParser.InvariantUtc
- a parser that usesCultureInfo.InvariantCulture
and UTC when converting relative timestamps to absolute timestamps.RelativityParser.Current
- the parser for the current asynchronous context. See Asynchronous Control Flow for more information.
The IRelativityParserFactory
interface defines a factory for creating custom IRelativityParser
instances. The default implementation of IRelativityParserFactory
is RelativityParserFactory
. You can use the static RelativityParserFactory.Default
property to obtain the default IRelativityParserFactory
instance, or create your own instance of RelativityParserFactory
directly.
Parser configurations for additional cultures can be registered with the IRelativityParserFactory
. To retrieve a parser instance for a specific culture, call the GetParser
method on the factory:
// Get a culture-specific parser that uses the system's local time zone.
var enGBParser = factory.GetParser(CultureInfo.GetCultureInfo("en-GB"));
You can also specify a time zone for the parser to use when parsing relative timestamps:
// Get a culture-specific parser that uses a specific time zone for relative
// timestamp conversion.
var parser = factory.GetParser(CultureInfo.GetCultureInfo("en-GB"),
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
If a parser configuration is not registered for a requested culture (or any of its parent cultures), the returned parser will use the default (invariant) base time and time offset keywords when parsing relative timestamps and durations.
Parsing Timestamps
Both absolute and relative timestamps can be parsed. Absolute timestamps are parsed according to the parser's CultureInfo
:
var date = parser.ConvertToUtcDateTime("2019-11-15T08:56:25.0901821Z");
Relative timestamps are expressed in the format base_time [+/- offset]
, where the base_time
matches one of the keywords defined in the parser's BaseTimeSettings
property, and the offset
is a number followed by one of the duration keywords defined in the parser's TimeOffsetSettings
property (e.g. 3D
for 3 days when using the invariant culture parser). White space inside the expression is ignored and the parser uses case-insensitive matching against the base_time
and offset
values.
For invariant and English (en
) culture parsers, the following base_time
values can be used:
Keyword | Description | Notes |
---|---|---|
NOW (or * ) |
Current time. | |
SECOND |
Start of the current second. | |
MINUTE |
Start of the current minute. | |
HOUR |
Start of the current hour. | |
DAY |
Start of the current day. | |
WEEK |
Start of the current week. | The CultureInfo for the parser is used to determine what the first day of the week is. |
MONTH |
Start of the current month. | |
YEAR |
Start of the current year. |
The following units can be used in relative timestamps with invariant and English-language parsers:
Keyword | Description | Fractional Quantities Allowed |
---|---|---|
MS |
Milliseconds | Yes |
S |
Seconds | Yes |
M |
Minutes | Yes |
H |
Hours | Yes |
D |
Days | Yes |
W |
Weeks | Yes |
MO |
Months | No |
Y |
Years | No |
Examples:
Example | Description |
---|---|
NOW + 15S |
Current time plus 15 seconds. |
*-10y |
Current time minus 10 years. |
day-0.5d |
Start of current day minus 0.5 days (i.e. 12 hours). |
MONTH |
Start of the current month. |
YEAR + 3MO |
Start of current year plus 3 calendar months. |
Note that the culture of the parser is also used when parsing offset quantities. For example, when using a parser with the
fi-FI
culture, the parser will expect a comma as a decimal separator when specifying a fractional quantity.
Base time values are converted to absolute times relative to a given DateTime
origin. If no origin is specified when parsing a timestamp, the current time for the parser's time zone is used:
// No origin specified; current time for the parser's time zone is used as the origin.
var date = parser.ConvertToUtcDateTime("DAY+6H");
// Use 10 days ago in the parser's time zone as the origin.
var date2 = parser.ConvertToUtcDateTime("DAY+6H",
parser.TimeZone.GetCurrentTime().AddDays(-10));
Parsing Durations
The parser will parse literal time spans, as well as duration expressions. Literal time spans are parsed according to the parser's CultureInfo
:
var timeSpan = parser.ConvertToTimeSpan("3.19:03:27.775");
Duration expressions are expressed in the same way as an offset on a relative timestamp i.e. a quantity followed by one of the duration keywords defined in the TimeOffsetSettings
property of the parser. The following units can be used in duration expressions with invariant and English-language parsers.
Keyword | Description | Fractional Quantities Allowed |
---|---|---|
MS |
Milliseconds | Yes |
S |
Seconds | Yes |
M |
Minutes | Yes |
H |
Hours | Yes |
D |
Days | Yes |
W |
Weeks | Yes |
Examples:
Example | Description |
---|---|
500ms |
500 milliseconds. |
15S |
15 seconds. |
0.5H |
0.5 hours (i.e. 30 minutes). |
1W |
1 week. |
Note that the culture of the parser is also used when parsing duration expressions. For example, when using a parser with the
fi-FI
culture, the parser will expect a comma as a decimal separator when specifying a fractional quantity.
Registering Parsers
A default set of well-known parser configurations are automatically registered with RelativityParserFactory
when the factory is created.
Additional parser configurations can also be passed to the RelativityParserFactory
constructor; these configurations will override any matching default parser registrations. The invariant culture parsers cannot be overridden.
To manually register a parser configuration for a given culture, call the IRelativityParserFactory.TryRegisterParser
method:
var fiFI = new RelativityParserConfiguration() {
CultureInfo = CultureInfo.GetCultureInfo("fi-FI"),
BaseTimeSettings = new RelativityBaseTimeSettings(
now: "NYT",
currentSecond: "SEKUNTI",
currentMinute: "MINUUTTI",
currentHour: "TUNTI",
currentDay: "PÄIVÄ",
currentWeek: "VIIKKO",
currentMonth: "KUUKAUSI",
currentYear: "VUOSI"
),
TimeOffsetSettings = new RelativityTimeOffsetSettings(
milliseconds: "MS",
seconds: "S",
minutes: "M",
hours: "T",
days: "VK", // Vuorokausi i.e. a 24-hour period of time.
weeks: "VI",
months: "KK",
years: "V"
)
};
var success = factory.TryRegisterParser(fiFI);
By default, existing parser registrations are not overwritten. To force registration, specify a value for the replaceExisting
parameter:
var success = factory.TryRegisterParser(fiFI, replaceExisting: true);
Asynchronous Control Flow
You can use the static RelativityParser.Current
property to get or set the parser for the current asynchronous context. This allows you to use the same parser anywhere within an asynchronous call stack without having to pass the parser as a parameter to each method. For example:
private static async Task RunAsync(IRelativityParserFactory factory) {
var factory = new RelativityParserFactory();
var tasks = new[] { "Tokyo Standard Time", "Pacific Standard Time" }.Select(x => RunForTimeZoneAsync(factory, x));
await Task.WhenAll(tasks);
}
private static async Task RunForTimeZoneAsync(IRelativityParserFactory factory, string timeZone) {
RelativityParser.Current = factory.GetParser(CultureInfo.InvariantCulture, TimeZoneInfo.FindSystemTimeZoneById(timeZone));
await PrintStartOfMonthAsync();
}
private static async Task PrintStartOfMonthAsync() {
await Task.Delay(TimeSpan.FromSeconds(1));
var date = RelativityParser.Current.ConvertToUtcDateTime("MONTH");
Console.WriteLine($"{RelativityParser.Current.TimeZone.Id}: {date} UTC");
}
// Example output:
// Tokyo Standard Time: 31/01/2024 15:00:00 UTC
// Pacific Standard Time: 01/02/2024 08:00:00 UTC
If no value has been set for RelativityParser.Current
for the current asynchronous context, RelativityParser.InvariantUtc
will be returned.
In ASP.NET Core or OWIN web applications, you can use middleware to automatically set RelativityParser.Current
for each request based on the culture and time zone information specified in the request.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8
- System.ComponentModel.Annotations (>= 5.0.0)
-
.NETStandard 2.0
- System.ComponentModel.Annotations (>= 5.0.0)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on IntelligentPlant.Relativity:
Package | Downloads |
---|---|
IntelligentPlant.DataCore.HttpClient
Strongly-typed client for Intelligent Plant's Data Core API. |
|
IntelligentPlant.Relativity.Owin
Provides extensions methods for registering IntelligentPlant.Relativity services with a .NET Framework OWIN application. |
|
IntelligentPlant.Relativity.DependencyInjection
Provides extensions methods for registering IntelligentPlant.Relativity services with an IServiceCollection. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2.0.0 | 118 | 10/22/2024 |
2.0.0-pre.13 | 53 | 10/21/2024 |
2.0.0-pre.12 | 49 | 10/21/2024 |
2.0.0-pre.11 | 82 | 3/1/2024 |
2.0.0-pre.10 | 51 | 2/29/2024 |
2.0.0-pre.9 | 54 | 2/29/2024 |
2.0.0-pre.8 | 53 | 2/29/2024 |
2.0.0-pre.7 | 54 | 2/29/2024 |
2.0.0-pre.4 | 57 | 2/29/2024 |
2.0.0-pre.3 | 56 | 2/28/2024 |
1.0.0 | 9,405 | 11/18/2019 |
0.1.1-alpha | 371 | 11/18/2019 |
0.1.0-alpha | 354 | 11/18/2019 |