/// <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); }
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); }
public void TryGetName_ValidValueResolvesToName() { const TimeZoneType tzt = TimeZoneType.Local; Assert .AreEqual(nameof(TimeZoneType.Local), tzt.TryGetName()); }
public void TryGetName_InValidValueResolvesToNull() { const TimeZoneType tzt = (TimeZoneType)int.MaxValue; Assert .AreEqual(null, tzt.TryGetName()); }
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()); } }
// 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; } }
// 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; } }
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); } }
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); } } }
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); }
public AbsoluteTimeRangeComponent(DateTime start, DateTime end, TimeZoneType timeZoneTypeType) { _start = start; _end = end; _timeZoneType = timeZoneTypeType; }
//历史值的读写 #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); }
public CloudWatchLogsInsightsUriBuilder WithAbsoluteRange(DateTime start, DateTime end, TimeZoneType timeZoneType = TimeZoneType.UTC) { _queryComponents[TimeRange] = new AbsoluteTimeRangeComponent(start, end, timeZoneType); return(this); }