【watcher】 #02 c# 中实现时间戳等,日期数字及大概率绝对随机数 实现

在Wacher的项目中,用到了很多时间记录的地方,为了将来能够和在线数据打通,我们使用了时间戳来记录时间信息

由于c# 没有现成的方法,所以我们重新写了一个Helper类来帮助我们使用这些公共函数

同时由于是静态函数,添加引用后我们便可以全局调用了。

1、通过日期获取当前的时间戳

这个时间戳是10位的时间戳,如果需要和JAVA兼容请在除法中取出3位,保存到毫秒级

        /// <summary>
        /// 获取时间戳
        /// </summary>
        /// <returns></returns>
        public static string GetTimeSecond(DateTime dataTime)
        {
            return ((dataTime.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString();
        }

2、通过时间戳获取到DateTime信息

(无论是string还是long类型,方法中价格强制类型转换即可,目前如果传参是long类型的话只需要ToString即可 )

        /// <summary>
        /// 由时间戳到系统时间
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        public static DateTime ReturnDateTime(string date)
        {
            DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
            long lTime = long.Parse(date + "0000000");
            TimeSpan toNow = new TimeSpan(lTime);
            return dtStart.Add(toNow);
        }

3、通过DateTime 获取数字类型的日期时间

(通过DateTime即可获得 20180808 类型的数字日期)

        /// <summary>
        /// 通过datetime格式获取 YMD格式数字类型日期
        ///
        /// </summary>
        /// <param name="dataTime"></param>
        /// <returns></returns>
        public static long GetDateInt(DateTime dataTime)
        {
            var dateLong= dataTime.ToString("yyyyMMdd");
            return Convert.ToInt64(dateLong);
        }

4、获取绝对随机字符或绝对随机

单机每秒请求10W次不重复,【在网络请求中,我们经常会用到request_id,服务端,客户端均可使用,实测一秒内10W次请求不重复】

原理:

使用基于计算机本身的识别因子随机数的随机因子+基于GUid的随机因子的随机数+短时间戳+base64进制转化为短字符。

参考资料:https://www.cnblogs.com/linJie1930906722/p/6115917.html

https://blog.csdn.net/zmq5411/article/details/47322257

/// <summary>
        /// 获取绝对随机数
        /// </summary>
        /// <returns></returns>
        public static string GetRandOnlyId()
        {
             var timeStamp= (DateTime.Now.ToUniversalTime().Ticks - 13560192000000000) / 10000000;// 减少时间戳位数形成新的短时间戳
            var beginRand= IntToi64(new Random(GetRandomSeed()).Next(0, 99999999));// 基于计算机硬件的随机因子产生随机数
            var endRand= IntToi64(new Random(GetGuidSeed()).Next(0, 99999999));// 基于Guid随机因子产生的的随机数
            var randString = beginRand+ IntToi64(timeStamp)+ endRand;
            return randString;
        }

        /// <summary>
        /// 获取不重复的随机数种子
        /// system.Security.Cryptography.RNGCryptoServiceProvider的类,它采用系统当前的硬件信息、进程信息、线程信息、系统启动时间和当前精确时间作为填充因子,通过更好的算法生成高质量的随机数
        /// </summary>
        /// <returns></returns>
        static int GetRandomSeed()
        {
            byte[] bytes = new byte[4];
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            rng.GetBytes(bytes);
            return BitConverter.ToInt32(bytes, 0);

        }

        /// <summary>
        /// 通过Guid  获取随机种子
        /// </summary>
        /// <returns></returns>
        static int GetGuidSeed()
        {
            byte[] buffer = Guid.NewGuid().ToByteArray();
            int iSeed = BitConverter.ToInt32(buffer, 0);
            return iSeed;
        }

        /// <summary>
        /// 十进制转64进制
        /// </summary>
        /// <param name="xx"></param>
        /// <returns></returns>
        public static string IntToi64(long xx)
        {
            string retStr = "";
            while (xx >= 1)
            {
                int index = Convert.ToInt16(xx - (xx / 64) * 64);
                retStr = Base64Code[index] + retStr;
                xx = xx / 64;
            }
            return retStr;
        }

        /// <summary>
        /// 64 位转化参数
        /// </summary>
        private static Dictionary<int, string> Base64Code = new Dictionary<int, string>() {
            {   0  ,"A"}, {   1  ,"B"}, {   2  ,"C"}, {   3  ,"D"}, {   4  ,"E"}, {   5  ,"F"}, {   6  ,"G"}, {   7  ,"H"}, {   8  ,"I"}, {   9  ,"J"},
            {   10  ,"K"}, {   11  ,"L"}, {   12  ,"M"}, {   13  ,"N"}, {   14  ,"O"}, {   15  ,"P"}, {   16  ,"Q"}, {   17  ,"R"}, {   18  ,"S"}, {   19  ,"T"},
            {   20  ,"U"}, {   21  ,"V"}, {   22  ,"W"}, {   23  ,"X"}, {   24  ,"Y"}, {   25  ,"Z"}, {   26  ,"a"}, {   27  ,"b"}, {   28  ,"c"}, {   29  ,"d"},
            {   30  ,"e"}, {   31  ,"f"}, {   32  ,"g"}, {   33  ,"h"}, {   34  ,"i"}, {   35  ,"j"}, {   36  ,"k"}, {   37  ,"l"}, {   38  ,"m"}, {   39  ,"n"},
            {   40  ,"o"}, {   41  ,"p"}, {   42  ,"q"}, {   43  ,"r"}, {   44  ,"s"}, {   45  ,"t"}, {   46  ,"u"}, {   47  ,"v"}, {   48  ,"w"}, {   49  ,"x"},
            {   50  ,"y"}, {   51  ,"z"}, {   52  ,"0"}, {   53  ,"1"}, {   54  ,"2"}, {   55  ,"3"}, {   56  ,"4"}, {   57  ,"5"}, {   58  ,"6"}, {   59  ,"7"},
            {   60  ,"8"}, {   61  ,"9"}, {   62  ,"+"}, {   63  ,"/"}, };

最后持续更新的 watcher beta 版下载:http://api.bobdong.cn/public/static/Win/Watcher%E5%AE%88%E6%9C%9B%E8%80%85.exe

Github地址:https://github.com/d100000/Watcher

欢迎大家提出建议

原文地址:https://www.cnblogs.com/Bobdong/p/9400218.html

时间: 2024-08-30 06:24:35

【watcher】 #02 c# 中实现时间戳等,日期数字及大概率绝对随机数 实现的相关文章

MYSQL中UNIX时间戳与日期的转换

mysql> select FROM_UNIXTIME(1156219870,'%y-%m-%d'); +--------------------------------------+ | FROM_UNIXTIME(1156219870,'%y-%m-%d') | +--------------------------------------+ | 06-08-22 | +--------------------------------------+ 1 row in set (0.03 se

js中时间戳与日期转换-js日期操作

常用的一些日期操作. 用js获取一个时间戳. <script type="text/javascript"> var date = new Date();//当前时间 alert(date.getTime());//转化的时间戳 </script> 得到的数值其实是从1970-1-1到当前的时间的毫秒数. <script type="text/javascript"> alert(new Date("1970-01-01

php中时间戳和日期格式的转换

一,PHP时间戳函数获取指定日期的unix时间戳 strtotime(”2009-1-22″) 示例如下: echo strtotime(”2009-1-22″) 结果:1232553600 说明:返回2009年1月22日0点0分0秒时间戳 二,PHP时间戳函数获取英文文本日期时间 示例如下: 便于比较,使用date将当时间戳与指定时间戳转换成系统时间 (1)打印明天此时的时间戳strtotime(”+1 day”) 当前时间:echo date(”Y-m-d H:i:s”,time()) 结果

c#中时间戳和日期的相互装换

时间戳转换为日期: /// <summary> /// 将时间戳转换为datetime类型 /// </summary> /// <param name="yn"></param> /// <returns></returns> public DateTime GetTime(int now) { string timeStamp = now.ToString(); DateTime dtStart = TimeZ

fiddler中抓包后时间戳转日期

时间戳转日期网址:https://tool.lu/timestamp/ 原文地址:https://www.cnblogs.com/jilulu/p/9822373.html

php日期时间戳,日期函数使用

date_default_timezone_get():获得当前php的时区 date_default_timezone_set():设置当前php的时区 date("Y-m-d H-i-s") time(): 返回当前时间戳(1970-1-1--至今)单位秒 strtotime(): 将以英文书写字符串(单词)的日期转换为时间戳(2015/3/16)可以设置增减量 mktime(): 把日期转换为时间戳(时分秒月日年),当前时区 gmmktime(): 返回一个零时区的时间戳(格林威

Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。

通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneId. ZonedDateTime是用来处理时区相关的时间,它的各种计算都离不开ZoneId.先看ZoneId. 1. ZoneId 为时区ID,比如Europe/Paris,表示欧洲巴黎时区 1.1 时区相关知识,时区,UTC时间,GMT时间,Unix时间戳 时区 地球自西向东旋转,东边比西边先看到

mysql UNIX时间戳与日期的相互转换

UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() Select UNIX_TIMESTAMP(’2006-11-04 12:23:00′); 例:mysql查询当天的记录数: $sql=”select * from message Where DATE_FORMAT(FROM_UNIXTIME(chattime),’%Y-%m-%d’) = DA

js 时间戳转为日期格式

js 时间戳转为日期格式 什么是Unix时间戳(Unix timestamp): Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数.Unix时间戳不仅被使用在Unix系统.类Unix系统中,也在许多其他操作系统中被广泛采用. 目前相当一部分操作系统使用32位二进制数字表示时间.此类系统的Unix时间戳最多可以使用到格林威治