如何取回转换后的时区值?

时间:2014-05-06 12:01:03

标签: c# asp.net datetime timezone timezone-offset

我正在使用以下代码将日期时间值转换为印度标准时间:

public DateTime GetdatetimedetailsinIST(DateTime datetimeinfo, String timeoffsetvalue)
{
    string offset= timeoffsetvalue;
    string timeZoneFormat = Convert.ToString("India Standard Time");
    string strIndianTimezone = timeZoneFormat;
    TimeZoneInfo tzinfoIndian = TimeZoneInfo.FindSystemTimeZoneById(strIndianTimezone);
    DateTime dtDateTime = datetimeinfo.AddMinutes(Convert.ToInt32(offset));//ToUniversalTime();
    dtDateTime = TimeZoneInfo.ConvertTimeFromUtc(dtDateTime, tzinfoIndian);
    return dtDateTime;
}

现在我打电话给GetdatetimedetailsinIST(5/6/2014 8:00:00 AM,"240");

它将在印度时间5/6/2014 5:30:00 PM重新开始。

现在我想通过使用值5/6/2014 5:30:00 PM来恢复5/6/2014 8:00:00 AM的另一个场景。

上述功能需要做哪些更改?

请帮忙。

3 个答案:

答案 0 :(得分:0)

但是你可以在convert方法中添加一个字符串timeZoneToConvertTo参数吗?

public static DateTime DateTimeConvert(DateTime nonConvertedDateTime, string timeoffsetvalue, string timeZoneToConvertTo)
    {
        TimeZoneInfo tzinfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneToConvertTo);
        DateTime dtDateTime = nonConvertedDateTime.AddMinutes(Convert.ToInt32(timeoffsetvalue));
        dtDateTime = TimeZoneInfo.ConvertTimeFromUtc(dtDateTime, tzinfo);
        return dtDateTime;
    }

Console.WriteLine(DateTimeConvert(new DateTime(2014, 5, 6, 8, 00, 00), "240", "India Standard Time").ToString());

Console.WriteLine(DateTimeConvert(new DateTime(2014, 5, 6, 8, 00, 00), "240", "Central Standard Time").ToString());

您仍然需要处理由于无法找到时区而导致的任何异常。

我不明白为什么你想要一个偏移而不是使用ToUniversal()扩展,但是,这是你的选择。

答案 1 :(得分:0)

很少需要或建议手动添加分钟。此外,您的方法周围还有许多不必要的字符串。请考虑以下内容:

public static DateTime ConvertToIndiaTime(DateTime dateTime, int offsetMinutes)
{
    // Create a DateTimeOffset from the input values.
    // This assumes positive offset values are *WEST* of UTC,
    // such as if it came from the getTimeZoneOffset function of
    // JavaScript's Date object.
    TimeSpan offset = TimeSpan.FromMinutes(-offsetMinutes);
    DateTimeOffset dto = new DateTimeOffset(dateTime, offset);

    // Convert the DateTimeOffset to the desired time zone
    DateTimeOffset converted =
        TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dto, "Indian Standard Time");

    // Return the DateTime portion, representing the local time in India.
    return converted.DateTime;
}

你会这样称呼:

// get a DateTime object
DateTime dt = DateTime.ParseExact("5/6/2014 8:00:00 AM",
                                  "M/d/yyyy h:mm:ss tt",
                                  CultureInfo.InvariantCulture);

// get the offset as an integer
int offsetMinutes = 240;

// call the conversion method
DateTime indiaTime = ConvertToIndiaTime(dt, offsetMinutes);

答案 2 :(得分:0)

您的方法似乎将两个单独的DateTime操作合并为一个 - 因此您不容易撤消操作。以下结构怎么样:

private static readonly TimeZoneInfo IstTimeZone =
   TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");

public static DateTime ConvertDateTimeUtcToIst(DateTime toConvert)
{
   return TimeZoneInfo.ConvertTimeFromUtc(toConvert, IstTimeZone);
}

public static DateTime ConvertDateTimeIstToUtc(DateTime toConvert)
{
   return TimeZoneInfo.ConvertTimeToUtc(toConvert, IstTimeZone);
}

用法:

var converted = ConvertDateTimeUtcToIst(DateTime.Parse("5/6/2014 8:00:00 AM"))
                   .AddMinutes(240);
var reverted = ConvertDateTimeIstToUtc(converted).AddMinutes(-240);

或者如果您绝对需要在一种方法中使用它:

public static DateTime ConvertDateTimeUtcToIst(
                          DateTime toConvert, int offset = 0)
{
   return TimeZoneInfo.ConvertTimeFromUtc(toConvert, IstTimeZone)
             .AddMinutes(offset);
}

public static DateTime ConvertDateTimeIstToUtc(
                          DateTime toConvert, int offset = 0)
{
   return TimeZoneInfo.ConvertTimeToUtc(toConvert, IstTimeZone)
             .AddMinutes(offset);
}

用法:

var converted = ConvertDateTimeUtcToIst(
                   DateTime.Parse("5/6/2014 8:00:00 AM"), 240);
var reverted = ConvertDateTimeIstToUtc(converted, -240);