DateTimeOffset (рд╕рдЦреНрдд)

рдЖрдЬ рд╕реБрдмрд╣ рдореЗрд░реЗ рджреЛрд╕реНрдд kirillkos рдПрдХ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред


рд╕рдорд╕реНрдпрд╛ рдХреЛрдб


рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ:


class Event { public string Message {get;set;} public DateTime EventTime {get;set;} } interface IEventProvider { IEnumerable<Event> GetEvents(); } 

рдФрд░ рдлрд┐рд░ рдХрдИ, IEventProvider рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ IEventProvider рдХрд░рддреЗ рд╣реИрдВред


рд╕рдорд╕реНрдпрд╛ : рдЗрди рд╕рднреА рдард┐рдХрд╛рдиреЛрдВ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдордп рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдпреВрдЖрдИ рдХреЛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЙрд▓рдЭрди рдореЗрдВ рд╣реИред


рд╣реЛрд▓реНрд╕рдмрд░реНрдЧ рдХреА рдЬрдп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдХреНрдпрд╛ рд╡реЗ рд╣рдореЗрдВ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ!


рдкреНрд░рдпрд╛рд╕ 1


 class Event { public string Message {get;set;} public DateTimeOffset EventTime {get;set; } } 

DateTimeOffset рд╢рд╛рдирджрд╛рд░ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдпрд╣ UTC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдСрдлрд╕реЗрдЯ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ MS SQL рдФрд░ Entity Framework рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИ (рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 6.3 рдореЗрдВ рдпрд╣ рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдЧрд╛)ред рд╣рдорд╛рд░реА рдХреЛрдб рд╢реИрд▓реА рдореЗрдВ, рд╕рднреА рдирдП рдХреЛрдб рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред


рдЕрдм рд╣рдо рдЗрди рд╕рдорд╛рди рдкреНрд░рджрд╛рддрд╛рдУрдВ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рдЧрд╛рддрд╛рд░, рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП, UI рдкрд░ рд╕рдм рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЬреАрдд!


рд╕рдорд╕реНрдпрд╛ : DateTimeOffset рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ DateTime рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдареАрдХ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:


 class Event { public string Message {get;set;} public DateTimeOffset EventTime {get;set; } } IEnumerable<Event> GetEvents() { return new[] { new Event() {EventTime = DateTime.Now, Message = "Hello from unknown time!"}, }; } 

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ DateTimeOffset рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ:


 // Local and Unspecified are both treated as Local public static implicit operator DateTimeOffset (DateTime dateTime); 

рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рд╣рдо рд╕рд┐рд░реНрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдЬрдм рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛: "рд▓реЗрдХрд┐рди рдпрд╣ рдШрдЯрдирд╛ рдХрд┐рд╕ рд╕рдордп рдФрд░ рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реБрдИ?" рдЬрд╝реЛрди рдХрд╣рд╛рдБ рд╕реЗ рдорд┐рд▓реЗрдЧрд╛? тАЭ рдЕрдХреНрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ, рдХрднреА-рдХрднреА рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗред рдФрд░ рдлрд┐рд░ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд┐рдирд╛ рд╕реЛрдЪреЗ рд╕рдордЭреЗ рдЧрд▓рддреА рдХрд░рдирд╛ред


рдзрд┐рдХреНрдХрд╛рд░ рд╣реИ рдирд┐рд╣рд┐рдд рдзрд░реНрдорд╛рдВрддрд░рдг!


рдкреНрд░рдпрд╛рд╕ реи


рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рд╕реБрдирд╛ рд╣реИ рдПрдХ рд╣рдереМрдбрд╝рд╛ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ , рдореБрдЭреЗ рд╕рдм рдХреБрдЫ рд▓рдЧрддрд╛ рд╣реИ рдирд╛рдЦреВрди рдЙрдирдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдорд╛рдорд▓реЗред рд╣рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ ... рдпрд╣ рдмрд╣реБрдд рдХрд╛рдо рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рд╡реИрд╕реЗ рднреА, рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХрд╛ рдХрд╛рдо рд╣реИред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦреЗрдВред


рдкреНрд░рдпрд╛рд╕ рей


рдЕрдм, рдЕрдЧрд░ рд╣рдо рдПрдл # рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╣реЛрдВрдЧреЗ, рддреЛ рдХрд┐рд░рд┐рд▓рдХреЛрд╕ рдиреЗ рдХрд╣рд╛ред
рд╣рдо рддрдм:


 type DateTimeOffsetStrict = Value of DateTimeOffset 

рдФрд░ рдЖрдЧреЗ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЬрд╛рджреВ рд╣рдореЗрдВ рдмрдЪрд╛ рд▓реЗрддрд╛ред рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╡реЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ F # рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Kirillkos рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ тЖТ


рдкреНрд░рдпрд╛рд╕ рек


рдХреНрдпрд╛ C # рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рдкреАрдбрд╝рд╛ рджреА рдЬрд╛рддреА рд╣реИред рдмрдВрдж рдХрд░реЛ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!


 /// <summary> /// Same as <see cref="DateTimeOffset"/> /// but w/o implicit conversion from <see cref="DateTime"/> /// </summary> public readonly struct DateTimeOffsetStrict { private DateTimeOffset Internal { get; } private DateTimeOffsetStrict(DateTimeOffset @internal) { Internal = @internal; } public static implicit operator DateTimeOffsetStrict(DateTimeOffset dto) => new DateTimeOffsetStrict(dto); public static implicit operator DateTimeOffset(DateTimeOffsetStrict strict) => strict.Internal; } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ DateTimeOffset рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди DateTime рд╕реЗ рдЗрд╕реЗ DateTime рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╕реЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреА, рджрд┐рдирд╛рдВрдХ рд╕рдордп рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИред рд╕рдВрдХрд▓рдХ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреА "рд╢реНрд░реГрдВрдЦрд▓рд╛" рдХреЛ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рд╡реЗ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддреЛ рдорд╛рдирдХ рдЗрд╕реЗ рдордирд╛ рдХрд░рддрд╛ рд╣реИ ( рдПрд╕рдУ рд╕реЗ рдЙрджреНрдзрд░рдг )ред рдЕрд░реНрдерд╛рддреН, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 class Event { public string Message {get;set;} public DateTimeOffsetStrict EventTime {get;set; } } IEnumerable<Event> GetEvents() { return new[] { new Event() {EventTime = DateTimeOffset.Now, Message = "Hello from unknown time!"}, }; } 

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ:


 IEnumerable<Event> GetEvents() { return new[] { new Event() {EventTime = DateTime.Now, Message = "Hello from unknown time!"}, }; } 

рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП рдерд╛!


рдкрд░рд┐рдгрд╛рдо


рд╣рдореЗрдВ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ рдпрд╛ рдирд╣реАрдВред рдХреЗрд╡рд▓ рд╣рд░ рдХреЛрдИ DateTimeOffset рдХрд╛ рдЖрджреА рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рдЕрдм рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рдЧреВрдВрдЧрд╛ рд╣реИред рд╣рд╛рдВ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдИрдПрдл, рдПрдПрд╕рдкреА.рдиреЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдФрд░ рдПрдХ рд╣рдЬрд╛рд░ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕реНрддрд░ рд╕рд╛рдордиреЗ рдЖрдПрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рди рдЦреБрдж рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХреА рддрд░рдХреАрдмреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ - рдореИрдВрдиреЗ UnsafeHtml рдЯрд╛рдЗрдк UnsafeHtml , рдЬрд┐рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ IHtmlString рдХреЗрд╡рд▓ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд╝рд░ рдХрд╣рдХрд░ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi438946/


All Articles