本文告诉大家在拿到任意时区的 DateTimeOffset 对象,将 DateTimeOffset 转换为使用中国的 +8 时区表示的时间 在开始之前,需要说明的是,采用 DateTimeOffset 会比 DateTime 更优的一个点是 DateTimeOffset 是带上时区的,这就意味着方便的在多个不同的时区进行传递和序列化的时候,不会丢失原来的信息 现在也推荐更多的使用 DateTimeOffset ); DateTimeOffset newDateTimeOffset = dateTimeOffset + timeSpan; 修改 China Standard Time 转换为 UTC 时间,代码如下 DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime(); DateTimeOffset newDateTimeOffset = utcDateTimeOffset + timeSpan; 以上就是转换为中国时间的方法
DateTime 是不带时区信息的,而 DateTimeOffset 是带时区偏移量的,可以用来表示一个特定的时刻。 在本文中,我们将探讨如何在 System.Text.Json 中将 DateTimeOffset 序列化为时间戳。 对象 var dateTimeOffset = new DateTimeOffset(2020, 10, 25, 10, 15, 0, TimeSpan.FromHours(8 )); // 序列化 DateTimeOffset 对象为 JSON var json = JsonSerializer.Serialize(dateTimeOffset 总结 本文介绍了如何使用 System.Text.Json 库将 DateTimeOffset 序列化为时间戳。
如需转换为本机时区时间,请使用 var dateTimeOffset = NtpClient.GetChineseNetworkTime();var 本机时区时间 = dateTimeOffset.LocalDateTime = await GetChineseNetworkTimeCore("ntp.aliyun.com"); // 阿里
dateTimeOffset ?? = new DateTimeOffset(dateTime, TimeSpan.Zero);
return dateTimeOffset;
} 类型,此 DateTimeOffset 和 DateTime 的最大差别在于 DateTimeOffset 是带时区的。 var dateTimeOffset = await NtpClient.GetChineseNetworkTime();
if (dateTimeOffset is
@datetimeoffset datetimeoffset(3) = @time; 4: 5: SELECT @time AS '@time', @datetimeoffset +00:00 ---- 1: -- datetimeoffset -> time 2: DECLARE @datetimeoffset datetimeoffset(4) = '12- datetimeoffset(3) = @date; 4: 5: SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset -- datetimeoffset -> date 2: DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10 +01:0 datetime = @datetimeoffset; 4: 5: SELECT @datetimeoffset AS '@datetimeoffset ', @datetime
private void FixFileDate(FileInfo file, DateTimeOffset createdTime, DateTimeOffset modifiedTime) { file.LastAccessTimeUtc = DateTimeOffset.Now.UtcDateTime; } 至于如何获取 Markdown 文件元数据中的时间,可以使用 YamlDotNet( UpdateMetaTime(file, file.CreationTimeUtc, file.LastWriteTimeUtc); void UpdateMetaTime(FileInfo file, DateTimeOffset publishDate, DateTimeOffset date) { var publishDateString = date.ToLocalTime().ToString("yyyy-MM-dd } 关于 UTC 时间 也许你注意到以上我使用的时间类型都是 DateTimeOffset 而不是 DateTime,这是因为 DateTimeOffset 中记录了时区信息,不至于在使用的过程中丢掉时区信息
SliddingWindowRateLimiter采用一种“讨巧”的实现,它直接利用了BoundedChannel<DateTimeOffset>对象,我们将指定的阈值作为它的最大容量。 > _reader; private readonly ChannelWriter<DateTimeOffset> _writer; public SliddingWindowRateLimiter SingleReader = false, SingleWriter = true }; var channel = Channel.CreateBounded<DateTimeOffset { if (limiter.TryAcquire()) { Console.WriteLine($"[{DateTimeOffset.Now { if (limiter.TryAcquire()) { Console.WriteLine($"[{DateTimeOffset.Now
GetNextOccurrence(string cronExpression, DateTimeOffset afterTimeUtc) { return new > GetNextOccurrences(string cronExpression, DateTimeOffset afterTimeUtc, int count) { CronExpression cron = new(cronExpression); List<DateTimeOffset> dateTimeOffsets = new(); </param> /// <returns></returns> public DateTimeOffset? (DateTimeOffset time) { return new DateTimeOffset(time.Year, time.Month,
(); } } void Do() { var end = DateTime.UtcNow.AddSeconds(2); SpinWait.SpinUntil(() => DateTimeOffset.UtcNow end); var isThreadPoolThread = Thread.CurrentThread.IsThreadPoolThread; Console.WriteLine($"[{DateTimeOffset.Now (); } } void Do() { var end = DateTime.UtcNow.AddSeconds(2); SpinWait.SpinUntil(() => DateTimeOffset.UtcNow end); var isThreadPoolThread = Thread.CurrentThread.IsThreadPoolThread; Console.WriteLine($"[{DateTimeOffset.Now (); var isThreadPoolThread = Thread.CurrentThread.IsThreadPoolThread; Console.WriteLine($"[{DateTimeOffset.Now
如需转换为本机时区时间,请使用 var dateTimeOffset = NtpClient.GetChineseNetworkTime();var 本机时区时间 = dateTimeOffset.LocalDateTime = await GetChineseNetworkTimeCore("ntp.tencent.com"); // 腾讯
dateTimeOffset ?? = await GetChineseNetworkTimeCore("ntp.aliyun.com"); // 阿里
dateTimeOffset ?? = await GetChineseNetworkTimeCore("cn.ntp.org.cn"); // 中国授时
dateTimeOffset ?? = new DateTimeOffset(dateTime, TimeSpan.Zero);
return dateTimeOffset;
}
, string, DateTimeOffset, string?>? privatereadonly FileLoggingOptions _options; privatereadonly BlockingCollection<(string log, DateTimeOffset dateTimeOffset) { if (_messageQueue.IsAddingCompleted) return; try { _messageQueue.Add((log, dateTimeOffset)); } catch (InvalidOperationException) { } // ignored } } } private void WriteLoggingEvent(string log, DateTimeOffset
.BuildServiceProvider() .GetRequiredService<IKeyManager>(); var key1 = keyManager.CreateNewKey(DateTimeOffset.Now , DateTimeOffset.Now.AddDays(1)); var key2 = keyManager.CreateNewKey(DateTimeOffset.Now ,DateTimeOffset.Now.AddDays (2)); var key3 = keyManager.CreateNewKey(DateTimeOffset.Now, DateTimeOffset.Now.AddDays(3)); Console.WriteLine var key = keyManager.GetAllKeys().First(); keyManager.RevokeKey(key.KeyId); keyManager.RevokeAllKeys(DateTimeOffset.Now
WriteBuildInfoTarget" AfterTargets="Build"> <WriteLinesToFile File="$(OutputPath)\BuildTime.txt" Lines="$([System.<em>DateTimeOffset</em> BuildTime.txt 文件,在这个文件里面可以看到当前的构建时间,大概内容如下 2022/10/29 16:12:53 +08:00 如果提示 error MSB4185: 类型“System.<em>DateTimeOffset</em> ”上的函数“get_Now”无法作为 MSBuild 属性函数执行 那么可以将 <em>DateTimeOffset</em> 降级使用 DateTime 代替。 BuildTime.txt" Lines="$([System.DateTime]::get_Now().ToString())" Overwrite="true"/> </Target> 使用 DateTimeOffset 在这里会比 DateTime 更优,因为 DateTimeOffset 能写入时区 如果担心遇到语言文化的问题,也就在其他的国家里面的对日期的格式化和中国不同,导致行为的不同。
; public Guid UserId { get; set; } public DateTimeOffset CreatedAt { get; set; } public DateTimeOffset? InvalidOperationException("Invalid input."); } note.Title = title; note.UpdatedAt = DateTimeOffset.UtcNow Error = "Invalid input." }; } note.Title = title; note.UpdatedAt = DateTimeOffset.UtcNow ErrorType.InvalidInput }; } note.Title = title; note.UpdatedAt = DateTimeOffset.UtcNow
state) { var nowTime = DateTime.Parse(DateTimeOffset.UtcNow.ToString("yyyy-MM-dd MethodInfo Action { get; set; } public object Context { get; set; } public DateTimeOffset state) { var nowTime = DateTime.Parse(DateTimeOffset.UtcNow.ToString("yyyy-MM-dd ; historyKeyList.Add(key); item.LastTime = DateTimeOffset.Now MethodInfo Action { get; set; } public object Context { get; set; } public DateTimeOffset
version7Guid.ToByteArray()[7] >> 4); Console.WriteLine($"Guid版本号: {version}"); // 输出: 7 时间戳集成 可基于特定时间生成Guid: DateTimeOffset Guid: {customGuid}"); // 输出示例: 0197ff15-d21f-7cd6-b066-bb4795eb3391 时间戳提取 从Version 7 Guid可反向解析生成时间: DateTimeOffset BitConverter.ToUInt32(bytes, 0) << 16) | (BitConverter.ToUInt16(bytes, 4) & 0xFFFF); return DateTimeOffset.FromUnixTimeMilliseconds (timestamp); } DateTimeOffset genTime = ExtractTimestamp(customGuid); Console.WriteLine($"解析时间: {genTime -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 在.NET实现中具体对应: // 时间戳处理(48位) long unixMs = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds
publicint Id { get; set; } [StringLength(64)] publicrequiredstring Title { get; set; } public DateTimeOffset context.Database.EnsureCreatedAsync(); { context.Posts.Add(new BlogPost { Title = "test", UpdatedAt = DateTimeOffset.Now ); context.Posts.Add(new BlogPost { Title = "[Disabled]test", UpdatedAt = DateTimeOffset.Now }); context.Posts.Add(new BlogPost { Title = "[Deleted]test", UpdatedAt = DateTimeOffset.Now
string> _keys = new HashSet<string> { "Count", "Min", "Max", "Mean", "Increment" }; private static DateTimeOffset = null && DateTimeOffset.UtcNow - _lastSampleTime.Value > TimeSpan.FromSeconds(1)) { Console.WriteLine(); } _lastSampleTime = DateTimeOffset.UtcNow; var metrics = keys.Contains(it.Key)) .Select(it => $"{it.Key} = {it.Value}"); var timestamp = DateTimeOffset.UtcNow.ToString
但它存在一些可能引发重大问题的缺陷: • 受服务器时区影响,当不同时区客户端共用数据库时会导致时间数据不可靠 • 难以在单元测试中模拟,导致测试结果不稳定 解决方案是使用DateTimeOffset.UtcNow : var timestamp = DateTime.Now; // 能用但不推荐 // 替代方案 var timestamp = DateTimeOffset.UtcNow; // 更优选择 为了支持单元测试 ,可以创建返回DateTimeOffset的接口,在需要时注入依赖: public interface IDateTimeProvider { DateTimeOffset GetCurrentTime (); } // 生产环境实现 public class DateTimeProvider : IDateTimeProvider { public DateTimeOffset GetCurrentTime () => DateTimeOffset.UtcNow; } // 测试环境可模拟实现 技巧2:EF Core全局查询过滤器 (适用版本:Entity Framework Core) 当需要频繁对某实体应用相同查询条件时
) TIMEFROMPARTS ( hour, minute, seconds, fractions,precision ) 参数precision 是指小数秒的精度,指的是DateTime2(n)、DateTimeOffset month(@date),1) 也可使用Format() 函数, 以字符串形式返回月份的第一天,例如,获取当前月份的第一天: FORMAT(GETDATE(),’yyyyMM01′) 3,切换时区 把DateTimeOffset 类型的数据切换到指定的时区,在转换过程当中,UTC时间是固定的,依据固定的UTC时间,切换到特定时区的本地时间: SWITCHOFFSET ( DATETIMEOFFSET, time_zone ) 参数注释 : DATETIMEOFFSET:DateTimeOffset(n)类型的变量 time_zone:指定的目标时区数据,格式是 [+|-] hh:mm 使用SwitchOffset()函数把DateTimeOffset
static async Task SetAbsoluteExpirationAsync<T>(this IDistributedCache cache, string key, T value, DateTimeOffset dateTimeOffset, CancellationToken cancellationToken = default) { var options = new DistributedCacheEntryOptions { AbsoluteExpiration = dateTimeOffset