(给DotNet加星标,提升.Net技能)
转自:程序员修炼之旅 cnblogs.com/xiaoXuZhi/p/netcoredatetime.html
前言
公司的新项目都是采用.NET Core来开发,在开发过程中,也踩到了一些坑,在此先总结两个坑,这两个坑都是关于Linux(CentOS)和windows下的兼容性问题。
///
/// 获取系统当前时间
///
/// 系统当前时间
public static DateTime GetSysDateTimeNow(){
Instant now = SystemClock.Instance.GetCurrentInstant();
var shanghaiZone = DateTimeZoneProviders.Tzdb["Asia/Shanghai"];
return now.InZone(shanghaiZone).ToDateTimeUnspecified();
}
是不是so easy?
我已经将源码上传到GitHub上,有兴趣的可以档下来
源码地址:https://github.com/xuyuanhong0902/XYH.Tools.git
源码:
/* ======================================
* 功能描述:所有时间的相关操作集合
* 创 建 者:程序修炼之旅 交流微信号:15908150902
* 创建日期: 2020-03-08
* CLR Version :1.0
* ==========================================*/
using NodaTime;
using System;
///
/// 公用帮助类
///
namespace XYH.Tools.DateTimeTools
{
///
/// 时间相关的操作类
///
public static class DateTimeTools
{
#region 获取系统当前时间的几个方法(返回时间+格式化后的时间字符串)
///
/// 获取系统当前时间
///
/// 系统当前时间
public static DateTime GetSysDateTimeNow(){
Instant now = SystemClock.Instance.GetCurrentInstant();
var shanghaiZone = DateTimeZoneProviders.Tzdb["Asia/Shanghai"];
return now.InZone(shanghaiZone).ToDateTimeUnspecified();
}
///
/// 获取系统当前时间格式化字符串 24小时制 被格式化为 (yyyy-MM-dd HH:mm:ss.fff)
///
/// 系统当前格式化的时间字符串(yyyy-MM-dd HH:mm:ss.fff)
public static string GetSysDateTimeNowStringYMD24HMSF(){
return GetSysDateTimeNow().ToStringYMD24HMSF();
}
///
/// 获取系统当前时间格式化字符串 12小时制 被格式化为 (yyyy-MM-dd hh:mm:ss.fff)
///
/// 系统当前格式化的时间字符串(yyyy-MM-dd hh:mm:ss.fff)
public static string GetSysDateTimeNowStringYMD12HMSF(this DateTime time){
return GetSysDateTimeNow().ToStringYMD12HMSF();
}
///
/// 获取系统当前时间格式化字符串 24小时制 被格式化为 (yyyy-MM-dd HH:mm:ss)
///
/// 系统当前格式化的时间字符串(yyyy-MM-dd HH:mm:ss)
public static string GetSysDateTimeNowStringYMD24HMS(this DateTime time){
return GetSysDateTimeNow().ToStringYMD24HMS();
}
///
/// 获取系统当前时间格式化字符串 12小时制 被格式化为 (yyyy-MM-dd hh:mm:ss)
///
/// 系统当前格式化的时间字符串(yyyy-MM-dd hh:mm:ss)
public static string GetSysDateTimeNowStringYMD12HMS(this DateTime time){
return GetSysDateTimeNow().ToStringYMD12HMS();
}
///
/// 获取系统当前时间格式化字符串 被格式化为 (yyyy-MM-dd)
///
/// 系统当前格式化的时间字符串(yyyy-MM-dd)
public static string GetSysDateTimeNowStringYMD(this DateTime time){
return GetSysDateTimeNow().ToStringYMD();
}
#endregion
#region DateTime 扩展几个 格式方法
///
/// 时间 格式化 24小时制 被格式化为 (yyyy-MM-dd HH:mm:ss.fff)
///
/// 被格式的时间
/// 格式化后的时间字符串(yyyy-MM-dd HH:mm:ss.fff)
public static string ToStringYMD24HMSF(this DateTime time){
return time.ToString("yyyy-MM-dd HH:mm:ss.fff");
}
///
/// 时间 格式化 12小时制 被格式化为 (yyyy-MM-dd hh:mm:ss.fff)
///
/// 被格式化时间
/// 格式化后的时间字符串(yyyy-MM-dd hh:mm:ss.fff)
public static string ToStringYMD12HMSF(this DateTime time){
return time.ToString("yyyy-MM-dd hh:mm:ss.fff");
}
///
/// 时间 格式化 24小时制 被格式化为 (yyyy-MM-dd HH:mm:ss)
///
/// 被格式化时间
/// 格式化后的时间字符串(yyyy-MM-dd HH:mm:ss)
public static string ToStringYMD24HMS(this DateTime time){
return time.ToString("yyyy-MM-dd HH:mm:ss");
}
///
/// 时间 格式化 12小时制 被格式化为 (yyyy-MM-dd hh:mm:ss)
///
/// 被格式化时间
/// 格式化后的时间字符串(yyyy-MM-dd hh:mm:ss)
public static string ToStringYMD12HMS(this DateTime time){
return time.ToString("yyyy-MM-dd hh:mm:ss");
}
///
/// 时间 格式化 被格式化为 (yyyy-MM-dd)
///
/// 被格式化时间
/// 格式化后的时间字符串(yyyy-MM-dd)
public static string ToStringYMD(this DateTime time){
return time.ToString("yyyy-MM-dd");
}
#endregion
#region 获取时间戳
///
/// 获取时间戳(秒)
///
/// 秒时间戳
public static long GetSecondTimestamp(){
// 以1970-1-1 为时间开始 同系统当前时间的秒差值即为秒时间戳
TimeSpan ts = GetSysDateTimeNow() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds);
}
///
/// 获取时间戳(毫秒)
///
/// 毫秒时间戳
public static long GetMilliSecondTimestamp(){
// 以1970-1-1 为时间开始 同系统当前时间的毫秒差值即为毫秒时间戳
TimeSpan ts = GetSysDateTimeNow() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalMilliseconds);
}
#endregion
#region 将一个时间戳转换为一个时间
///
/// 将一个秒时间戳转换为时间格式(秒)
///
/// 秒时间戳
/// 转换后的时间
public static DateTime? SecondStampToDateTime(long secondTimestamp)
{
// 做一个简单的判断
if (secondTimestamp <= 0)
{
return null;
}
// 以1970-1-1 为时间开始,通过计算与之的时间差,来计算其对应的时间
DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
dateTime = dateTime.AddSeconds(secondTimestamp).ToLocalTime();
return dateTime;
}
///
/// 将一个字符串秒时间戳转换为时间格式(秒)
///
/// 字符串秒时间戳
/// 转换后的时间
public static DateTime? SecondStampToDateTime(string secondTimestampStr)
{
// 如果为空,那么直接返回null
if (string.IsNullOrEmpty(secondTimestampStr))
{
return null;
}
// 首先将字符串时间戳转换为数字
long secondTimestamp = 0;
long.TryParse(secondTimestampStr, out secondTimestamp);
// 调用
return SecondStampToDateTime(secondTimestamp);
}
///
/// 将一个字符串毫秒时间戳转换为时间格式(毫秒)
///
/// 字符串毫秒时间戳
/// 转换后的时间
public static DateTime? MilliSecondStampToDateTime(long secondTimestamp)
{
// 做一个简单的判断
if (secondTimestamp <= 0)
{
return null;
}
// 以1970-1-1 为时间开始,通过计算与之的时间差,来计算其对应的时间
DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
dateTime = dateTime.AddMilliseconds(secondTimestamp).ToLocalTime();
return dateTime;
}
///
/// 将一个毫秒时间戳转换为时间格式(毫秒)
///
/// 毫秒时间戳
/// 转换后的时间
public static DateTime? MilliSecondStampToDateTime(string milliSecondStampStr)
{
// 如果为空,那么直接返回null
if (string.IsNullOrEmpty(milliSecondStampStr))
{
return null;
}
// 首先将字符串时间戳转换为数字
long milliSecondStamp = 0;
long.TryParse(milliSecondStampStr, out milliSecondStamp);
// 调用
return MilliSecondStampToDateTime(milliSecondStamp);
}
#endregion
}
}
我们以后在写.NET程序的时候,无论是否会采用.NET Core实现linux系统部署,我们都也该想到不同系统的兼容性问题,在实现上都采用一个通用的方式来实现,那么以后在做项目升级,系统迁移的时候,就会少一些麻烦。嘿嘿,今天就先到这,后续我在分享一下其它.NET Core实战所踩的坑。
推荐阅读 点击标题可跳转 分享一个基于.NET Core 3.1开发的模块化项目 一个轻量级的基于.NET Core的ORM框架HSQL C#开发PDF阅读器初探看完本文有收获?请转发分享给更多人
关注「DotNet」加星标,提升.Net技能
好文章,我在看❤️