Exemplo n.º 1
0
        /// <summary>
        /// 当前时间生成Unix时间戳
        /// </summary>
        /// <param name="timeZoneType">时区类型</param>
        /// <param name="timeSpanPrecisionType">时间戳精度类型</param>
        /// <returns>Unix时间戳</returns>
        public static long GetUnixTimeStamp(TimeZoneType timeZoneType, TimeSpanPrecisionType timeSpanPrecisionType)
        {
            DateTime startTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);//当前的格林威治时间

            if (timeZoneType == TimeZoneType.EasEightArea)
            {
                startTime = TimeZone.CurrentTimeZone.ToLocalTime(startTime);//将当前时间格林威治时间转换成东八区时间
            }
            DateTime nowTime = DateTime.Now;

            double _double = 0;

            if (timeSpanPrecisionType == TimeSpanPrecisionType.Milliseconds)
            {
                _double = (nowTime - startTime).TotalMilliseconds;
            }
            else if (timeSpanPrecisionType == TimeSpanPrecisionType.Seconds)
            {
                _double = (nowTime - startTime).Seconds;
            }

            long unixTime = (long)System.Math.Round(_double, MidpointRounding.AwayFromZero);

            return(unixTime);
        }
Exemplo n.º 2
0
            private bool LoadInnerMetaZones(XmlReader reader)
            {
                string type;

                if (reader.Name != "timezone" ||
                    !(type = reader.GetAttribute("type")).HasValue())
                {
                    return(false);
                }
                TimeZoneType info;

                if (!_loader._timeZoneInfoMap.TryGetValue(type, out info))
                {
                    info      = new TimeZoneType();
                    info.Name = type;
                    _loader._timeZoneInfoMap.Add(type, info);
                }
                else
                {
                    throw new Exception($"Duplicate timezone {type}");
                }
                reader.LoadElements(_loader, info.LoadUses);

                return(true);
            }
Exemplo n.º 3
0
        public void TryGetName_ValidValueResolvesToName()
        {
            const TimeZoneType tzt = TimeZoneType.Local;

            Assert
            .AreEqual(nameof(TimeZoneType.Local), tzt.TryGetName());
        }
Exemplo n.º 4
0
        public void TryGetName_InValidValueResolvesToNull()
        {
            const TimeZoneType tzt = (TimeZoneType)int.MaxValue;

            Assert
            .AreEqual(null, tzt.TryGetName());
        }
Exemplo n.º 5
0
        public static DateTime ConvertDateTimeToUtc(DateTime dateTime, TimeZoneType timeZone)
        {
            DateTime convertedUtcTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, GetTimeZoneInfo(timeZone));

            convertedUtcTime = DateTime.SpecifyKind(convertedUtcTime, DateTimeKind.Utc);

            return(convertedUtcTime);
        }
 public void OutputTimeZoneType(TimeZoneType valueSet)
 {
     OutputStatusMessage(string.Format("Values in {0}", valueSet.GetType()));
     foreach (var value in Enum.GetValues(typeof(TimeZoneType)))
     {
         OutputStatusMessage(value.ToString());
     }
 }
Exemplo n.º 7
0
        // Reference for time zones:
        // http://www.xiirus.net/articles/article-_net-convert-datetime-from-one-timezone-to-another-7e44y.aspx
        public static TimeZoneInfo GetTimeZoneInfo(TimeZoneType timeZoneTypes)
        {
            string timeZoneId = "NotSet";

            try
            {
                switch (timeZoneTypes)
                {
                case TimeZoneType.EET:
                    timeZoneId = "Eastern European Time";
                    break;

                case TimeZoneType.EST:
                    timeZoneId = "Eastern Standard Time";
                    break;

                case TimeZoneType.PST:
                    timeZoneId = "Pacific Standard Time";
                    break;

                case TimeZoneType.CET:
                    timeZoneId = "Central European Standard Time";
                    break;

                case TimeZoneType.GMT:
                    timeZoneId = "GMT Standard Time";
                    break;

                case TimeZoneType.GMT1:
                    timeZoneId = "W. Europe Standard Time";
                    break;

                case TimeZoneType.CEST:
                    timeZoneId = "Central European Summer Time";
                    break;

                default:
                    throw new NotImplementedException("GetTimeZoneInfo: Not implemented for time zone " +
                                                      timeZoneTypes);
                }

                return(TimeZoneInfo.FindSystemTimeZoneById(timeZoneId));
            }
            catch (TimeZoneNotFoundException)
            {
                // Console.WriteLine("Unable to find the {0} zone in the registry.", timeZoneId);
                throw;
            }
            catch (InvalidTimeZoneException)
            {
                //Console.WriteLine("Registry data on the {0} zone has been corrupted.", timeZoneId);
                throw;
            }
        }
Exemplo n.º 8
0
        // Reference for time zones:
        // http://www.xiirus.net/articles/article-_net-convert-datetime-from-one-timezone-to-another-7e44y.aspx
        public static TimeZoneInfo GetTimeZoneInfo(TimeZoneType timeZoneTypes)
        {
            string timeZoneId = "NotSet";

            try
            {
                switch (timeZoneTypes)
                {
                case TimeZoneType.EST:
                    timeZoneId = "Eastern Standard Time";
                    break;

                case TimeZoneType.PST:
                    timeZoneId = "Pacific Standard Time";
                    break;

                case TimeZoneType.CET:
                    timeZoneId = "Central European Standard Time";
                    break;

                case TimeZoneType.GMT:
                    timeZoneId = "GMT Standard Time";
                    break;

                case TimeZoneType.GMT1:
                    timeZoneId = "W. Europe Standard Time";
                    break;

                case TimeZoneType.CEST:
                    timeZoneId = "Central European Summer Time";
                    break;

                case TimeZoneType.Current:
                    timeZoneId = TimeZoneInfo.Local.Id;
                    break;

                default:
                    throw new NotImplementedException("GetTimeZoneInfo: Not implemented for time zone " +
                                                      timeZoneTypes);
                }

                return(TimeZoneInfo.FindSystemTimeZoneById(timeZoneId));
            }
            catch (TimeZoneNotFoundException)
            {
                throw;
            }
            catch (InvalidTimeZoneException)
            {
                throw;
            }
        }
Exemplo n.º 9
0
            private void LoadWindowMap(string name, List <AttributeValue> arg2)
            {
                if (name != "mapZone")
                {
                    return;
                }
                Territory      territory = null;
                WindowTimeZone zone      = null;

                string[] types = null;
                foreach (var a in arg2)
                {
                    switch (a.Name)
                    {
                    case "other":
                        zone = _loader._windowZones.GetOrCreate(a.Value);
                        break;

                    case "territory":
                        territory = _loader.GetTerritory(a.Value);
                        break;

                    case "type":
                        types = a.Value.SplitAtSpaces();

                        break;
                    }
                }
                if (zone != null && types != null && types.Length > 0)
                {
                    if (territory == null || territory.Code == "001")
                    {
                        if (types.Length == 1)
                        {
                            zone.Default = _loader.FindZone(types[0]);
                            return;
                        }
                    }

                    var zones = new TimeZoneType[types.Length];
                    for (int i = 0; i < types.Length; i++)
                    {
                        TimeZoneType z = _loader.FindZone(types[i]);
                        zones[i] = z;
                    }
                    zone.Add(territory, zones);
                }
            }
Exemplo n.º 10
0
            private void LoadMapZone(string elmName, List <AttributeValue> attributes)
            {
                if (elmName != "mapZone")
                {
                    return;
                }
                MetaTimeZone meta      = null;
                Territory    territory = null;
                TimeZoneType zone      = null;

                foreach (AttributeValue attribute in attributes)
                {
                    switch (attribute.Name)
                    {
                    case "other":
                        meta = _loader.GetMetaZone(attribute.Value);
                        break;

                    case "territory":
                        territory = _loader.GetTerritory(attribute.Value);
                        break;

                    case "type":
                        zone = _loader._timeZoneInfoMap[attribute.Value];
                        break;
                    }
                }
                if (meta != null && zone != null)
                {
                    if (territory == null || territory.Code.SameName("GMT"))
                    {
                        meta.Default = zone;
                    }
                    else
                    {
                        meta.Add(territory, zone);
                    }
                }
            }
Exemplo n.º 11
0
        protected override DateTime ParseDateUtc(string[] handLines)
        {
            //Date looks like: 04 02 2012 23:59:48
            string dateString = DateLineRegex.Match(handLines[2]).Value;

            //Change string so it becomes 2012-02-04 23:59:48
            dateString = DateRegex.Replace(dateString, "$3-$2-$1 ");

            DateTime dateTime = DateTime.Parse(dateString);

            TimeZoneType timeZone = TimeZoneType.GMT;

            // WSOP and TowerTorneosPoker used local time zone for hand history.
            if (handLines[1].Contains("WSOP.com") || handLines[1].Contains("TowerTorneosPoker"))
            {
                timeZone = TimeZoneType.Current;
            }

            DateTime utcTime = TimeZoneUtil.ConvertDateTimeToUtc(dateTime, timeZone);

            return(utcTime);
        }
Exemplo n.º 12
0
 public AbsoluteTimeRangeComponent(DateTime start, DateTime end, TimeZoneType timeZoneTypeType)
 {
     _start        = start;
     _end          = end;
     _timeZoneType = timeZoneTypeType;
 }
Exemplo n.º 13
0
        //历史值的读写
        #region 读取历史数据原始值:public List<PValue> GetRawValues(string tagname, DateTime startdate, DateTime enddate)重点函数,概化计算引擎用。
        /// <summary>
        /// GetRawValues是实时库读取历史数据接口的对外封装。无论何种实时数据库,读取历史数据功能都是指,读取某一个指定标签(tagname)在一段时间内(startdate、enddate)的历史值(浮点型)
        /// 而不同的实时数据库,真正的读取方法和返回值的数据类型略有区别
        /// ——经测试,_pgimDb.ReadRaw读取数据的数据量又限值
        /// </summary>
        /// <param name="tagname">标签名</param>
        /// <param name="startdate">起始时间</param>
        /// <param name="enddate">结束时间</param>
        /// <returns>历史数据,PValue集合</returns>
        public List <PValue> GetRawValues(string tagname, DateTime startdate, DateTime enddate)
        {
            //什么时候需要抛出异常:如果在Helper层抛出异常,才RTDBDAO层,就会捕捉异常,并且根据参数设置进行重读。
            //——所以,需要进行数据重新读取的地方,要抛出异常
            //——无需进行数据重新读取,需要直接跳下一个数据去读的地方,直接返回null

            List <PValue> pvalues = new List <PValue>();

            if (!this._pgimDb.IsLogon)
            {
                //将pgim的异常PgimDataException记录在_exception中,并以PgimDataException的名称继续抛出异常
                this._exception = "PgimNet登录参数IsLogon为false,连接已经关闭!";
                throw new Exception(this._exception);     //将pgim的异常继续向外传递。
            }
            if (startdate >= enddate)
            {
                return(null);                        //如果起始和截止时刻大小不对,直接返回null。不报错。计算引擎中不会出现
            }
            //标签名称的的处理
            //——tagname标签名称中的路径\\在计算引擎读取时为了不发生转义符歧义错误,统一转换为^。在真正读取的时候,读写接口,还是要转换为\
            tagname = tagname.Replace("^", "\\");

            #region 20181227修改,新的实时数据库接口,仅返回阶梯状曲线,不再提供标志位,以不同方式返回曲线

            /*
             *  //读取方式判断
             * //——如果标签名称中有用逗号分割,并带标志位step,则在起始点没有值时,使用端点前的值直接作为端点值。即视曲线为阶梯状
             * //——如果标签名称中没有逗号分割的标志位inner,则需要在端点进行插值。即视曲线为折线状。
             * bool InterploationTerminal=true;                                                //在端点进行插值的标志位,正常情况下都要进行插值
             * string[] tagnameStrs = Regex.Split(tagname, ",|,");
             * if (tagnameStrs.Length == 2 && tagnameStrs[1].Trim().ToUpper() == "STEP")    //如果标签名称中含有“step”标志位,比如01U_UL52-9XI01_F_VALUE,inner,则不在端点进行插值,而直接使用前值。
             * {
             *  InterploationTerminal = false;
             *  tagname = tagnameStrs[0];
             * }
             */
            #endregion

            //关于返回数据与时间段的关系:
            //——1、ReadRaw()返回的头一个数据是startdate时间前,离startdate最近的一个原始值。包括这个时刻和这个时刻的值。如果startdate时刻点恰好有值,则返回的及时startdate时刻的值
            //——2、ReadRaw()返回的最后一个数据是enddate时间前,离enddate最近的一个原始值。包括这个时刻和这个时刻的值。如果enddate时刻点恰好有值,则返回的及时startdate时刻的值
            //——3、如果读取时间段内没有数据,ReadRaw()会返回截止时刻前第一个有效数据。如果一直没有有效数据,会返回标签初始化时1970年的初始化值。如果初始化值没有则返回截止时刻以后的第一个有效值。
            //关于时区:
            //ReadRaw()方法与上面的ReadCurrent不同。PGIM数据库一般存储的是格林威治标准时间。而ReadRaw()读出的时间有两种情况。
            //——1、第一种情况,ReadRaw()不加时区参数,则此时ReadRaw()根据PGIM\plantconnect.sys\syskonfi\timezone\timezone.txt的设定,对数据时间进行自动转换。
            //   这种情况下,入参的startdate和endate,会根据timezone.txt,转换到对应的格林威治时间段,然后从从数据库取出数据,再根据timezone.txt转为指定时区的时间段
            //   总结一句话,就是入参startdate、enddate,返回的数据,都会跟着timezone.txt定义的时区差来转
            //——2、第二种情况,ReadRaw()加时区参数,则此时ReadRaw()根据时区参数自动转换时间。
            //   这种情况下,startdate和enddate,会根据时区参数,转为格林威治时间,然后从数据库找对应时间的数据,取出后,在把时间转化为指定时区的时间
            //——3、在本helper中,为了和其他数据库保持通用和一直,我们规定GetRawValues读取的时间,都要能够自动的转换成为helper所在客户端的时区时间。
            //   因此我们采用带时区的ReadRaw(),设定时区参数为GMT,
            //   这样读取的数据返回的都是pgim的格林威治时间,在读出以后转成客户端时区时间。
            //   当时区参数设置为GMT时,ReadRaw()默认需要startdate,enddate也是格林威治时间,因此我们要先把startdate、enddate从本地时间转为格林威治时间
            //关于读取数量:
            //——ReadRaw()一次读取的数据是有限的,如果startdate和enddate之间的数据超过22w条,则ReadRaw()会直接报错,这点和golden数据库不同。
            //——第四个参数top不能够防止startdate和enddate之间的数据过多时的出错。仅仅是在数据量小于22w条,ReadRaw()可以读取历史数据的情况下,限定返回这些数据的前多少条
            List <SignalValue> list     = new List <SignalValue>();
            TimeZoneType       timezone = TimeZoneType.GMT;

            try
            {
                //var swTimer = Stopwatch.StartNew();               //用于测试读接口速度
                list = this._pgimDb.ReadRaw(this._userId, tagname, startdate.ToUniversalTime(), enddate.ToUniversalTime(), 200000, timezone);
                //realSpan = swTimer.Elapsed.ToString();            //用于测试读接口速度
            }
            //关于出错处理
            //由于helper的原则是不对错误进行处理,错误处理放在DAO层。由不同的DAO层根据自己的需要来处理错误。
            //因此需要对helper层出错的可能性有大概了解。不同数据库的接口,出错机制不一样。以下是pgim的ReadRaw()常见出错情况,需要在DAO层做相应处理
            //0、服务器的available client没有空余,会报错
            //1、pgim的标签名称中含有服务器节点名称。当服务器节点名称与实际连接的服务器名称不一致,会报此错误。
            //2、如果标签中,表示scanner服务器名称、scanner协议名称、点名的部分不对。会报错。
            //3、如果读取时间内,返回的数据量过多,则报错
            //以上错误,需要在DAO中进行处理。
            catch (PgimNet.Exceptions.PgimDataException ex)
            {
                //将pgim的异常PgimDataException记录在_exception中,并以PgimDataException的名称继续抛出异常
                this._exception = ex.Message.ToString();
                throw ex;     //将pgim的异常继续向外传递。
            }
            catch (PgimNet.Exceptions.PgimException ex)
            {
                //将pgim的异常PgimDataException记录在_exception中,并以PgimDataException的名称继续抛出异常
                this._exception = ex.Message.ToString();
                throw ex;     //将pgim的异常继续向外传递。
            }
            catch (Exception ex)
            {
                //将pgim的异常PgimDataException记录在_exception中,并以PgimDataException的名称继续抛出异常
                this._exception = "PgimNet其他未知错误。通常是服务器故障、标签中路径部分对应的服务器名称不正确导致!";
                throw ex;     //将pgim的异常继续向外传递。
            }

            //以下判断条件包含了以下非正常情况:
            //1、如果读取时间段内没有数据,且起始时刻前有非正常状态(停机,dcs断电),则返回list.count=0.
            //2、如果读取时间段内没有数据,起始时刻之前也没有数据,则返回1970年初始化值
            //3、如果读取时间段内没有数据,且初始化值也没有,会返回截止时刻以后的第一个有效值。list[list.Count - 1].Timestamp > enddate.ToUniversalTime()
            //4、其他非正常状态,list=null
            DateTime iniDateTime = DateTime.Parse("1971-01-01");
            if (list == null || list.Count == 0 || list[0].Timestamp <iniDateTime || list[list.Count - 1].Timestamp> enddate.ToUniversalTime())
            {
                return(null);                                                                                                                                  //直接返null,外部程序可以根据pvalues.count是否为0来处理
            }
            //——pgim在数据库中寻找与startdate相等于或早于startdate的第一个值,作为返回的第一个值。list第一个值即为startdate时刻或之前第一个有效值
            //——pgim在数据库中寻找与enddate相等或早于endate的第一个值,作为返回的最后一个值。list最后一个值即为endtime时刻或之前第一个有效值
            //——注意,此时读取出的数据,时间均为格林威治时间
            #region 20181227修改,新的实时数据库接口,仅返回阶梯状曲线,不再设法去取截止时刻后的点来做截止时刻的插值

            /*
             * //对最后一个点的处理
             * //——pgim默认返回截止时刻或之前一个时刻点的值,在计算引擎体系中,默认需要最后截止时刻的插值,因此需要取找最后时刻后的值
             * //——经测试,PGIM的ReadAggregates,使用起始时刻和截止时刻,得不到这些时刻点的插值。PGIM提供插值的方式,仍然是阶梯状的。
             * //——因此,想要得到截止时刻的插值,必须通过ReadRaw找到截止时刻后面的值,才能去求插值
             *
             * if (list[list.Count - 1].Timestamp < enddate.ToUniversalTime())
             * {
             *  //从截止时刻开始向后一天,返回最前面的两个值。因为list[list.Count - 1].Timestamp < enddate.ToUniversalTime。
             *  //所以,第一个值,肯定是结束时刻前的一个值。第二个值肯定是结束时刻后的时间最近的一个值。
             *  List<SignalValue> last = new List<SignalValue>();
             *  try
             *  {
             *      //var swTimer1 = Stopwatch.StartNew();             //用于测试读接口速度
             *      last = this._pgimDb.ReadRaw(this._userId, tagname, enddate.ToUniversalTime(), enddate.AddDays(1).ToUniversalTime(), 2, timezone);   //向后1天如果查不到合适的数据,就用最末尾的数据。向后的时间不能太长,否则ReadRaw的耗时将大幅增加
             *      //realSpan = swTimer1.Elapsed.ToString();          //用于测试读接口速度
             *  }
             *  catch (PgimNet.Exceptions.PgimDataException ex)
             *  {
             *      //将pgim的异常PgimDataException记录在_exception中,并以PgimDataException的名称继续抛出异常
             *      this._exception = ex.Message.ToString();
             *      throw ex;     //将pgim的异常继续向外传递。
             *  }
             *  catch (PgimNet.Exceptions.PgimException ex)
             *  {
             *      //将pgim的异常PgimDataException记录在_exception中,并以PgimDataException的名称继续抛出异常
             *      this._exception = ex.Message.ToString();
             *      throw ex;     //将pgim的异常继续向外传递。
             *  }
             *  catch (Exception ex)
             *  {
             *      //将pgim的异常PgimDataException记录在_exception中,并以PgimDataException的名称继续抛出异常
             *      this._exception = "PgimNet其他未知错误。通常是服务器故障、标签中对应的服务器名称不正确导致!";
             *      throw ex;     //将pgim的异常继续向外传递。
             *  }
             *
             *  if (last != null && last.Count != 0 && last.Count == 2)
             *  {
             *      list.Add(last[1]);  //如果在截止时刻后一个月之内,可以找到截止时刻后面的一个值,则将该值加入到list
             *  }
             *  else
             *      list.Add(new SignalValue(enddate.ToUniversalTime(), list[list.Count - 1].Value, list[list.Count - 1].Status));  //如果在截止时刻后一个月之内,找不到截止时刻后的有效值,则用截止时刻前的值作为截止时刻值。
             *
             * }
             */
            #endregion
            pvalues = Signals2PValuesHist(list);

            //最后得到的list是:
            //——从startdate或之前第一个有效值从开始,到截止时间enddate或之后第一个有效值为止的点集合.
            //ReadRaw()返回0个点的情况,上面直接退出,返回空list。由外部RTDBDAO处理。
            //ReadRaw()如果返回至少一个值,经过补足,list最后至少有两个点
            //将结果转换为List<PValus>
            //list的时间均为GMT时间,pvalues的时间均为本地时间
            //调整起始时刻的值。

            //如果恰好起始时刻前无前值,但是起始时刻和截止时刻间有值,则只会返回缺失起止时刻到第一个有效值之间数据的结果,此时用第一个数据去补全缺失段(会造成计算不准确,但是这种情况是特例)。
            if (pvalues[0].Timestamp > startdate)
            {
                pvalues[0].Timestamp = startdate;
            }
            //如果第一个值小于起始时刻,则直接用前一时刻的值,作为起始时刻的值。
            if (pvalues[0].Timestamp < startdate)
            {
                pvalues[0].Timestamp = startdate;     //将第一个点的时间戳替换为起始时间
            }
            //调整截止时刻的值。
            if (pvalues[pvalues.Count - 1].Timestamp < enddate)
            {
                //如果最后一个点的时间戳小于截止时刻,则说明没有找到截止时刻后值
                pvalues[pvalues.Count - 1].Endtime = enddate;
                pvalues.Add(new PValue(pvalues[pvalues.Count - 1].Value, enddate, enddate, pvalues[pvalues.Count - 1].Status)); //添加截止时刻点
            }
            else if (pvalues[pvalues.Count - 1].Timestamp == enddate)
            {
                //恰好有截止时刻点,将该值作为截止时刻值
                pvalues[pvalues.Count - 1].Endtime = enddate;
            }
            else
            {
                //取到截止时刻点后值
                pvalues[pvalues.Count - 2].Endtime = enddate;           //修改前一个值的结束时刻到enddate
                //将最后一个值,变为截止时刻点
                pvalues[pvalues.Count - 1].Value     = pvalues[pvalues.Count - 2].Value;
                pvalues[pvalues.Count - 1].Timestamp = enddate;
                pvalues[pvalues.Count - 1].Endtime   = enddate;
                pvalues[pvalues.Count - 1].Status    = pvalues[pvalues.Count - 2].Status;
            }

            return(pvalues);
        }
Exemplo n.º 14
0
        public CloudWatchLogsInsightsUriBuilder WithAbsoluteRange(DateTime start, DateTime end, TimeZoneType timeZoneType = TimeZoneType.UTC)
        {
            _queryComponents[TimeRange] = new AbsoluteTimeRangeComponent(start, end, timeZoneType);

            return(this);
        }