Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊.netcore采坑那一些事之系统时间and文件路径

聊聊.netcore采坑那一些事之系统时间and文件路径

作者头像
小小许
发布于 2020-06-19 10:24:14
发布于 2020-06-19 10:24:14
1.5K00
代码可运行
举报
文章被收录于专栏:angularejs学习篇angularejs学习篇
运行总次数:0
代码可运行

聊聊.netcore采坑那一些事之系统时间and文件路径

Hi,小伙伴大家好,最近工作比较忙,很久没有和大家分享点东西了。这个周末都加了两天班。公司的新项目都是采用.netcore来开发,在开发过程中,也踩到了一些坑,在此先总结两个坑,这两个坑都是关于Linux(CentOS)和windows下的兼容性问题。我们最开始的开发环境接口调用一直是部署在windows环境运行一切正常,但是部署到Linux(CentOS)环境下,就出现了这两个问题,其实问题也简单:获取系统时间,实际时间少了8个小时;文件路径​被识别为了文件名。下面就简单分享一下解决方式,其实只要你一看,发现很简单的,之所以分享出来,当你才开始用户.netcore时,可以有一个提示作用,嘿嘿!

一、DateTime.Now获取系统时间少了8个小时

.net core项目,部署到LinuxCentOS)上的时候,发现DateTime.Now获取的时间与Windows不一致,获取到系统时间比系统的时间实际少了8个小时,发现这一个问题,大家第一时间想到的是时区差异。网上搜了一下,发现还有不少的小伙伴遇到了同样的问题,有给出了对应的解决方式,具体如下:

具体原因就是:Linux和Windows两者所采用的时区不同,两者的时区分别为:Linux:IANA,Windows:Windows time zone IDs。这就是最终元凶啦!

找到原因后,那么该如何解决呢?方式很简单,就是两者采用同一个时区不就完事了嘛,最终统一采用IANA,在实现上可以借助第三方库:NodaTime。具体实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /// <summary>

        /// 获取系统当前时间

        /// </summary>

        /// <returns>系统当前时间</returns>

        public static DateTime GetSysDateTimeNow()

        {

            Instant now = SystemClock.Instance.GetCurrentInstant();

            var shanghaiZone = DateTimeZoneProviders.Tzdb["Asia/Shanghai"];

            return now.InZone(shanghaiZone).ToDateTimeUnspecified();

      }

是不是so easy?

其实我们使用时间的时候,会有很多种方式,也会对时间做很多格式转换,比如:yyyy-MM-dd HH:mm:ss格式化时间,时间和时间戳的相互转换等等。为了统一规范操作,在实际项目中,我们对时间的操作根据实际需要做了一个统一封装,当然了在很多人看来是没有多大技术含量的,也是哦,其目的是为了实现统一控制,方便管理,提高代码的复用性。现在我也把代码贴出,如果有需要的,你可以参考一下,同时我也生成了一个包,放到Nuget上,包名为(XYH.Tools.DateTimeTools),如果有需要的,可以挡下来使用。

我已经将源码上传到GitHub上,有兴趣的可以档下来

源码地址:https://github.com/xuyuanhong0902/XYH.Tools.git

源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* ==============================================================================
 * 功能描述:所有时间的相关操作集合  
 * 创 建 者:程序修炼之旅 交流微信号:15908150902
 * 创建日期: 2020-03-08
 * CLR Version :1.0
 * ==============================================================================*/

using NodaTime;
using System;

/// <summary>
/// 公用帮助类
/// </summary>
namespace XYH.Tools.DateTimeTools
{
    /// <summary>
    /// 时间相关的操作类
    /// </summary>
    public static class DateTimeTools
    {
        #region 获取系统当前时间的几个方法(返回时间+格式化后的时间字符串)

        /// <summary>
        /// 获取系统当前时间
        /// </summary>
        /// <returns>系统当前时间</returns>
        public static DateTime GetSysDateTimeNow()
        {
            Instant now = SystemClock.Instance.GetCurrentInstant();
            var shanghaiZone = DateTimeZoneProviders.Tzdb["Asia/Shanghai"];
            return now.InZone(shanghaiZone).ToDateTimeUnspecified();
        }

        /// <summary>
        /// 获取系统当前时间格式化字符串 24小时制 被格式化为 (yyyy-MM-dd HH:mm:ss.fff)
        /// </summary>
        /// <returns>系统当前格式化的时间字符串(yyyy-MM-dd HH:mm:ss.fff)</returns>
        public static string GetSysDateTimeNowStringYMD24HMSF()
        {
            return GetSysDateTimeNow().ToStringYMD24HMSF();
        }

        /// <summary>
        /// 获取系统当前时间格式化字符串 12小时制 被格式化为 (yyyy-MM-dd hh:mm:ss.fff)
        /// </summary>
        /// <returns>系统当前格式化的时间字符串(yyyy-MM-dd hh:mm:ss.fff)</returns>
        public static string GetSysDateTimeNowStringYMD12HMSF(this DateTime time)
        {
            return GetSysDateTimeNow().ToStringYMD12HMSF();
        }

        /// <summary>
        /// 获取系统当前时间格式化字符串 24小时制 被格式化为 (yyyy-MM-dd HH:mm:ss)
        /// </summary>
        /// <returns>系统当前格式化的时间字符串(yyyy-MM-dd HH:mm:ss)</returns>
        public static string GetSysDateTimeNowStringYMD24HMS(this DateTime time)
        {
            return GetSysDateTimeNow().ToStringYMD24HMS();
        }

        /// <summary>
        /// 获取系统当前时间格式化字符串 12小时制 被格式化为 (yyyy-MM-dd hh:mm:ss)
        /// </summary>
        /// <returns>系统当前格式化的时间字符串(yyyy-MM-dd hh:mm:ss)</returns>
        public static string GetSysDateTimeNowStringYMD12HMS(this DateTime time)
        {
            return GetSysDateTimeNow().ToStringYMD12HMS();
        }

        /// <summary>
        /// 获取系统当前时间格式化字符串  被格式化为 (yyyy-MM-dd)
        /// </summary>
        /// <returns>系统当前格式化的时间字符串(yyyy-MM-dd)</returns>
        public static string GetSysDateTimeNowStringYMD(this DateTime time)
        {
            return GetSysDateTimeNow().ToStringYMD();
        }

        #endregion

        #region DateTime 扩展几个 格式方法

        /// <summary>
        /// 时间 格式化 24小时制 被格式化为  (yyyy-MM-dd HH:mm:ss.fff)
        /// </summary>
        /// <param name="time">被格式的时间</param>
        /// <returns>格式化后的时间字符串(yyyy-MM-dd HH:mm:ss.fff)</returns>
        public static string ToStringYMD24HMSF(this DateTime time)
        {
            return time.ToString("yyyy-MM-dd HH:mm:ss.fff");
        }

        /// <summary>
        /// 时间 格式化 12小时制 被格式化为  (yyyy-MM-dd hh:mm:ss.fff)
        /// </summary>
        /// <param name="time">被格式化时间</param>
        /// <returns>格式化后的时间字符串(yyyy-MM-dd hh:mm:ss.fff)</returns>
        public static string ToStringYMD12HMSF(this DateTime time)
        {
            return time.ToString("yyyy-MM-dd hh:mm:ss.fff");
        }

        /// <summary>
        /// 时间 格式化 24小时制 被格式化为  (yyyy-MM-dd HH:mm:ss)
        /// </summary>
        /// <param name="time">被格式化时间</param>
        /// <returns>格式化后的时间字符串(yyyy-MM-dd HH:mm:ss)</returns>
        public static string ToStringYMD24HMS(this DateTime time)
        {
            return time.ToString("yyyy-MM-dd HH:mm:ss");
        }

        /// <summary>
        /// 时间 格式化 12小时制 被格式化为  (yyyy-MM-dd hh:mm:ss)
        /// </summary>
        /// <param name="time">被格式化时间</param>
        /// <returns>格式化后的时间字符串(yyyy-MM-dd hh:mm:ss)</returns>
        public static string ToStringYMD12HMS(this DateTime time)
        {
            return time.ToString("yyyy-MM-dd hh:mm:ss");
        }

        /// <summary>
        /// 时间 格式化  被格式化为  (yyyy-MM-dd)
        /// </summary>
        /// <param name="time">被格式化时间</param>
        /// <returns>格式化后的时间字符串(yyyy-MM-dd)</returns>
        public static string ToStringYMD(this DateTime time)
        {
            return time.ToString("yyyy-MM-dd");
        }

        #endregion

        #region 获取时间戳

        /// <summary>
        /// 获取时间戳(秒)
        /// </summary>
        /// <returns>秒时间戳</returns>
        public static long GetSecondTimestamp()
        {
            // 以1970-1-1 为时间开始 同系统当前时间的秒差值即为秒时间戳
            TimeSpan ts = GetSysDateTimeNow() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds);
        }

        /// <summary>
        /// 获取时间戳(毫秒)
        /// </summary>
        /// <returns>毫秒时间戳</returns>
        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 将一个时间戳转换为一个时间

        /// <summary>
        /// 将一个秒时间戳转换为时间格式(秒)
        /// </summary>
        /// <param name="secondTimestamp">秒时间戳</param>
        /// <returns>转换后的时间</returns>
        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;
        }

        /// <summary>
        /// 将一个字符串秒时间戳转换为时间格式(秒)
        /// </summary>
        /// <param name="secondTimestampStr">字符串秒时间戳</param>
        /// <returns>转换后的时间</returns>
        public static DateTime? SecondStampToDateTime(string secondTimestampStr)
        {
            // 如果为空,那么直接返回null
            if (string.IsNullOrEmpty(secondTimestampStr))
            {
                return null;
            }

            // 首先将字符串时间戳转换为数字
            long secondTimestamp = 0;
            long.TryParse(secondTimestampStr, out secondTimestamp);

            // 调用
            return SecondStampToDateTime(secondTimestamp);
        }

        /// <summary>
        /// 将一个字符串毫秒时间戳转换为时间格式(毫秒)
        /// </summary>
        /// <param name="secondTimestampStr">字符串毫秒时间戳</param>
        /// <returns>转换后的时间</returns>
        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;
        }

        /// <summary>
        /// 将一个毫秒时间戳转换为时间格式(毫秒)
        /// </summary>
        /// <param name="milliSecondStampStr">毫秒时间戳</param>
        /// <returns>转换后的时间</returns>
        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
    }
}

二、文件路径被识别为了文件名

哈哈,最近还遇到一个有趣的事情,就是在Windows上,文件路径的创建,都是正确的,但是部署到CentOS,所创建的文件,所有路径都变成了文件名称,所有文件都在根目录下了。

网上找了一下原因,就是文件路径左斜杠和右斜杠的问题。在Windows上无论是左斜杠还是右斜杠都没有问题,但是在linux中只支持右斜杠,将代码中所用到的路径操作,都统一修改为右斜杠,问题就解决了。文件路径1/文件路径2/文件名

三、总结

  回头来看这两个问题,都是系统的兼容性问题,在仔细想一下,也是一个习惯性问题,尤其是文件路径这问题,我们要习惯的用右斜杠。

我们以后在写.net程序的时候,无论是否会采用.netcore实现linux系统部署,我们都也该想到不同系统的兼容性问题,在实现上都采用一个通用的方式来实现,那么以后在做项目升级,系统迁移的时候,就会少一些麻烦。嘿嘿,今天就先到这,后续我在分享一下其它.netcore实战所踩的坑。谢谢您的阅读。

Hi,小伙伴大家好,最近工作比较忙,很久没有和大家分享点东西了。这个周末都加了两天班。公司的新项目都是采用.netcore来开发,在开发过程中,也踩到了一些坑,在此先总结两个坑,这两个坑都是关于Linux(CentOS)和windows下的兼容性问题。我们最开始的开发环境接口调用一直是部署在windows环境运行一切正常,但是部署到Linux(CentOS)环境下,就出现了这两个问题,其实问题也简单:获取系统时间,实际时间少了8个小时;文件路径​被识别为了文件名。下面就简单分享一下解决方式,其实只要你一看,发现很简单的,之所以分享出来,当你才开始用户.netcore时,可以有一个提示作用,嘿嘿!

END

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java 获取当前系统时间 时间比较
import java.util.Date; import java.text.SimpleDateFormat;
全栈程序员站长
2022/11/02
2.8K0
日期和时间构造
这些构造采用 ODBC 日期、时间或时间戳格式的整数或字符串,并将其转换为相应的 IRIS 日期、时间或时间戳格式。他们执行数据输入以及值和范围检查。
用户7741497
2022/08/02
2.3K0
将string字符串转成LocalDateTime工具类
``` public class LocalDateTimeUtil { /** * 将Long类型的时间戳转换成String 类型的时间格式,时间格式为:yyyy-MM-dd HH:mm:ss */ public static String convertTimeToString(Long time){ if (StringUtils.isEmpty(time)){ return null; } DateTimeFormatter ftf = DateTimeF
高大北
2022/06/14
4.3K0
时间格式化中的毫秒占位符详解:从 Python 到 Java
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2024/09/25
3410
时间格式化中的毫秒占位符详解:从 Python 到 Java
Java 时间处理
在标准 Java 类库中包含一个 Date 类。它的对象表示一个特定的瞬间,精确到毫秒。
帅飞
2019/01/22
2.3K0
java时间工具类[通俗易懂]
类型的日期工具类还有很多,比如Hutool的日期工具类也很不错 Hutool日期工具文档 maven依赖
全栈程序员站长
2022/09/12
7290
Java时间转换
package com.example.administrator.huijianzhi.util; import android.annotation.SuppressLint; import
用户5899361
2020/12/07
6.1K0
Java&Android获取当前日期、时间、星期几、获取指定格式的日期时间、时间戳工具类包含使用示例
时间格式内部其余的横线“-”、空格“ ”、冒号“:”、点号“.”等字符仅仅是连接符,方便观看各种单位的时间数字而已,国内,也可以使用形如“yyyy年dd日HHmm分ss秒”的时间格式。
晨曦_LLW
2020/09/25
6K0
C#常用操作类库一(验证类)
public class Validator     {         #region  验证输入字符串为数字         /// <summary>         /// 验证输入字符串为数字         /// </summary>         /// <param name="strln">输入字符</param>         /// <returns>返回一个bool类型的值</returns>         public static bool IsNumber(string
跟着阿笨一起玩NET
2018/09/18
8180
hutool官网(hutool好用吗)
看本篇文章前,建议先对java源码的日期和时间有一定的了解,如果不了解的话,可以先看这篇文章:
全栈程序员站长
2022/07/28
18.1K0
hutool官网(hutool好用吗)
Java8新特性之日期、时间操作
java.time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类
Remember_Ray
2020/08/03
6.7K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
参考 https://blog.csdn.net/duan196_118/article/details/111597682 https://blog.csdn.net/qq_24754061/article/details/95500209 https://xijia.blog.csdn.net/article/details/106007147
时间静止不是简史
2023/02/23
4.9K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
常用工具类之:DateUtils
import java.text.ParseException; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; import org.joda.time.DateTime; /** * <p>
芈亓
2022/06/17
1.3K0
js和java日期的常用相关操作
js日期的相关操作 1. 时间戳时间格式化 代码如下: // 时间戳时间格式化 function timestampToTime(timestamp) { var date = new Da
不愿意做鱼的小鲸鱼
2022/09/26
3K0
常用的时间工具类
1.说明:收集一些常用的时间工具类,仅用作记录和学习交流。可以使用CTRL+F搜索关键字。
JaneYork
2023/10/11
2050
常用的时间工具类
前后端时间转换的那些常见问题及处理方法
在现代的Web开发中,前后端分离的架构已经成为主流,尤其是在Spring Boot和Vue.js的组合中。开发者在这种架构下经常遇到的一个问题就是如何处理时间的转换和显示。前端和后端对时间的处理方式不同,可能会导致时间在传递过程中出现问题,比如时区不同步、格式不一致等。因此,本文将详细讨论在Spring Boot + Vue前后端分离架构中如何处理时间转换问题,并提供一些解决方案。
繁依Fanyi
2024/08/16
5330
.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)
打开“服务”应用(可以在开始菜单搜索“服务”),找到“Windows Time”服务。右键点击“Windows Time”服务,选择“重启”。
Wesky
2024/08/13
3100
.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)
SQL函数 MINUTE
MINUTE 返回一个整数,指定给定时间或日期时间值的分钟数。为 $HOROLOG 或 $ZTIMESTAMP 值、ODBC 格式日期字符串或时间戳计算分钟。
用户7741497
2022/04/12
6541
SQL函数 HOUR
Hour返回一个整数,指定给定时间或日期时间值的小时。小时是根据$HOROLOG或$ZTIMESTAMP值、ODBC格式的日期字符串或时间戳计算的。
用户7741497
2022/04/04
4750
彻底解决Spring mvc中时间类型的转换和序列化问题
在使用Spring mvc 进行开发时我们经常遇到前端传来的某种格式的时间字符串无法用java8时间包下的具体类型参数来直接接收。同时还有一系列的序列化 、反序列化问题,在返回前端带时间类型的同样会出现一些格式化的问题。今天我们来彻底解决他们。
码农小胖哥
2019/12/10
4.6K0
相关推荐
java 获取当前系统时间 时间比较
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验