Version: 5.xhtml
英文原文地址:Time unitsc#
與 Elasticsearch 交互,咱們會遇到須要設定時間段的狀況(例如:timeout
參數)。爲了指定時間段,咱們能夠使用一個表示時間的整數(以毫秒爲單位),也能夠使用一個時間值(例如:2d
表示 2 天)。api
NEST 使用一個 Time
類型來知足上述需求,有好幾種方式來構造 Time
對象。elasticsearch
最直接的方式固然是構造函數了,參數能夠是列表中的任意一種:ide
TimeSpan
對象var unitString = new Time("2d"); var unitComposed = new Time(2, Nest.TimeUnit.Day); var unitTimeSpan = new Time(TimeSpan.FromDays(2)); var unitMilliseconds = new Time(1000 * 60 * 60 * 24 * 2);
Time
對象序列化後的結果是一個由因子和間隔構成的字符串,如:上面這段代碼中的變量序列化的結果都是 2d
函數
即便沒有使用 Time(double ms) 這個構造函數,Time
的 Milliseconds
屬性也會被計算。ui
unitMilliseconds.Milliseconds.Should().Be(1000*60*60*24*2); unitComposed.Milliseconds.Should().Be(1000*60*60*24*2); unitTimeSpan.Milliseconds.Should().Be(1000*60*60*24*2); unitString.Milliseconds.Should().Be(1000*60*60*24*2);
NEST 提供了從 string
TimeSpan
double
到 Time
的隱式轉換,提升了易用性。code
Time oneAndHalfYear = "1.5y"; Time fourteenDays = TimeSpan.FromDays(14); Time twoDays = 1000*60*60*24*2; Expect("1.5y").WhenSerializing(oneAndHalfYear); Expect("14d").WhenSerializing(fourteenDays); Expect("2d").WhenSerializing(twoDays);
處理 年和月 的時候,是沒法精確計算毫秒數的,Milliseconds
的值爲 -1 。這是由於年和月不是固定的值,舉個栗子htm
Time oneAndHalfYear = "1.5y"; oneAndHalfYear.Milliseconds.Should().Be(-1);
你能夠將兩個 Time
對象作比較對象
Time twoDays = 1000*60*60*24*2; oneAndHalfYear.Should().BeGreaterThan(fourteenDays); (oneAndHalfYear > fourteenDays).Should().BeTrue(); (oneAndHalfYear >= fourteenDays).Should().BeTrue(); (twoDays != null).Should().BeTrue(); (twoDays >= new Time("2d")).Should().BeTrue(); twoDays.Should().BeLessThan(fourteenDays); (twoDays < fourteenDays).Should().BeTrue(); (twoDays <= fourteenDays).Should().BeTrue(); (twoDays <= new Time("2d")).Should().BeTrue();
斷定相等性
twoDays.Should().Be(new Time("2d")); (twoDays == new Time("2d")).Should().BeTrue(); (twoDays != new Time("2.1d")).Should().BeTrue(); (new Time("2.1d") == new Time(TimeSpan.FromDays(2.1))).Should().BeTrue();
相等的精確度爲 0.1 納秒
Time oneNanosecond = new Time(1, Nest.TimeUnit.Nanoseconds); Time onePointNoughtNineNanoseconds = "1.09nanos"; Time onePointOneNanoseconds = "1.1nanos"; (oneNanosecond == onePointNoughtNineNanoseconds).Should().BeTrue(); (oneNanosecond == onePointOneNanoseconds).Should().BeFalse();
Elasticsearch 有兩個特殊的時間值
0
經過 Time.Zero
表示-1
經過 Time.MinusOne
表示下面的對象都等於 Time.MinusOne
Time.MinusOne.Should().Be(Time.MinusOne); new Time("-1").Should().Be(Time.MinusOne); new Time(-1).Should().Be(Time.MinusOne); ((Time) (-1)).Should().Be(Time.MinusOne); ((Time) "-1").Should().Be(Time.MinusOne); ((Time) (-1)).Should().Be((Time) "-1");
下面的對象都等於 Time.Zero
Time.Zero.Should().Be(Time.Zero); new Time("0").Should().Be(Time.Zero); new Time(0).Should().Be(Time.Zero); ((Time) 0).Should().Be(Time.Zero); ((Time) "0").Should().Be(Time.Zero); ((Time) 0).Should().Be((Time) "0");
特殊的時間值 0
和 -1
能夠和其餘 Time
值作比較,儘管這看起來很荒謬。
var twoDays = new Time(2, Nest.TimeUnit.Day); Time.MinusOne.Should().BeLessThan(Time.Zero); Time.Zero.Should().BeGreaterThan(Time.MinusOne); Time.Zero.Should().BeLessThan(twoDays); Time.MinusOne.Should().BeLessThan(twoDays);
若是須要構造一個 -1ms 或者 0ms 的時間,使用接收因子和間隔的構造函數,或者指定一個 ms 字符串
(new Time(-1, Nest.TimeUnit.Millisecond) == new Time("-1ms")).Should().BeTrue(); (new Time(0, Nest.TimeUnit.Millisecond) == new Time("0ms")).Should().BeTrue();
能夠使用一個 DateInterval
和 Time
構成的共用體 Union<DateInterval, Time>
來指定一個 Time 的單位,它支持 Time
和 DateInterval
的隱式轉換
Expect("month").WhenSerializing<Union<DateInterval, Time>>(DateInterval.Month); Expect("day").WhenSerializing<Union<DateInterval, Time>>(DateInterval.Day); Expect("hour").WhenSerializing<Union<DateInterval, Time>>(DateInterval.Hour); Expect("minute").WhenSerializing<Union<DateInterval, Time>>(DateInterval.Minute); Expect("quarter").WhenSerializing<Union<DateInterval, Time>>(DateInterval.Quarter); Expect("second").WhenSerializing<Union<DateInterval, Time>>(DateInterval.Second); Expect("week").WhenSerializing<Union<DateInterval, Time>>(DateInterval.Week); Expect("year").WhenSerializing<Union<DateInterval, Time>>(DateInterval.Year); Expect("2d").WhenSerializing<Union<DateInterval, Time>>((Time)"2d"); Expect("11664m").WhenSerializing<Union<DateInterval, Time>>((Time)TimeSpan.FromDays(8.1));