[SqlFunction(DataAccess = DataAccessKind.Read, IsDeterministic = true, Name = "API_UTC_TIME")]
public static SqlDateTime fnApiUtcTime(SqlDateTime OrigDate, SqlString CurrentTimeZone)
{
try
{
TimeZoneParm tzp = TimeZoneData.GetTimeZoneParm(CurrentTimeZone.ToString());
int offsethr = 0;
int offsetmi = 0;
int dst_offsethr = 0;
int dst_offsetmi = 0;
string dst_eff_key = "01110000";
string dst_end_key = "01110000";
offsethr = tzp.OffSetHr;
offsetmi = tzp.OffSetMi;
dst_offsethr = tzp.DstOffSetHr;
dst_offsetmi = tzp.DstOffSetMi;
dst_eff_key = tzp.DstEffDt;
dst_end_key = tzp.DstEndDt;
DateTime origDate = DateTime.Parse(OrigDate.ToString());
int dst_eff_mon = int.Parse(dst_eff_key.Substring(0, 2));
int dst_eff_wk = int.Parse(dst_eff_key.Substring(2, 1));
int dst_eff_dw = int.Parse(dst_eff_key.Substring(3, 1));
int dst_eff_hr = int.Parse(dst_eff_key.Substring(4, 2));
int dst_eff_mi = int.Parse(dst_eff_key.Substring(6, 2));
int dst_end_mon = int.Parse(dst_end_key.Substring(0, 2));
int dst_end_wk = int.Parse(dst_end_key.Substring(2, 1));
int dst_end_dw = int.Parse(dst_end_key.Substring(3, 1));
int dst_end_hr = int.Parse(dst_end_key.Substring(4, 2));
int dst_end_mi = int.Parse(dst_end_key.Substring(6, 2));
DateTime dst_eff_dt_test = new DateTime(origDate.Year, dst_eff_mon, 1);
dst_eff_dt_test = dst_eff_dt_test.AddDays((double)(-1 * DayOfWeekId(dst_eff_dt_test.DayOfWeek)));
DateTime dst_eff_dt = dst_eff_dt_test.AddDays(dst_eff_wk * 7);
dst_eff_dt = dst_eff_dt.AddHours(dst_eff_hr);
dst_eff_dt = dst_eff_dt.AddMinutes(dst_eff_mi);
dst_eff_dt = dst_eff_dt.AddDays(dst_eff_dw - 1);
if (dst_eff_dt.Month != dst_eff_mon)
{
dst_eff_dt = dst_eff_dt.AddDays(-7);
}
DateTime dst_end_dt_test = new DateTime(origDate.Year, dst_end_mon, 1);
dst_end_dt_test = dst_end_dt_test.AddDays((double)(-1 * DayOfWeekId(dst_end_dt_test.DayOfWeek)));
DateTime dst_end_dt = dst_end_dt_test.AddDays(dst_end_wk * 7);
dst_end_dt = dst_end_dt.AddHours(dst_end_hr);
dst_end_dt = dst_end_dt.AddMinutes(dst_end_mi);
dst_end_dt = dst_end_dt.AddDays(dst_end_dw - 1);
if (dst_end_dt.Month != dst_end_mon)
{
dst_end_dt = dst_end_dt.AddDays(-7);
}
DateTime newDate = origDate.AddHours(offsethr * -1).AddMinutes(offsetmi * -1);
DateTime newDateDst = origDate.AddHours(dst_offsethr * -1).AddMinutes(dst_offsetmi * -1);
bool isDST = false;
if (origDate >= dst_eff_dt)
{
if (origDate <= dst_end_dt)
{
isDST = true;
}
}
if (isDST)
{
return (SqlDateTime)newDateDst;
}
else
{
return (SqlDateTime)newDate;
}
}
catch (Exception ex)
{
return OrigDate;
}
}