所有国家/地区的日期时间在.NET中都有疑问

时间:2013-09-29 08:39:00

标签: asp.net .net vb.net datetime

大家好,我对datetime有一些疑问。

system.DateTime.Now是返回当前本地日期。

以下代码有助于获取当前的印度日期时间

Dim IndianTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time")
Dim IndianDateTime = TimeZoneInfo.ConvertTime(USDateTime, IndianTimeZoneInfo)

但此时美国和英国等国家的日期时间不同。我如何用简单的代码管理它?

上述代码的主要疑问仅限印度时间,但如果我们想要美国或其他国家/地区的时间,我们需要为不同国家/地区分开代码(如果是,那么我们会编写很多代码,这很好吗?) ?还是其他任何想法?

请指教。谢谢!

修改

简单的问题是如何存储不同国家/地区的当前日期时间?

2 个答案:

答案 0 :(得分:2)

@RameshRajendran这是一篇文章和文章中的一些代码,我肯定不会完成你的项目。 但希望它可以帮助您从不同的角度看待它。 正如@varocarbas所指出的,创建一个存储最终编译信息的表将会很好。

文章链接: http://msdn.microsoft.com/en-us/library/vstudio/bb397781(v=vs.110).aspx

您可以使用SupportsDaylightSavingTime属性来查看是否有时区规则。

您还可以使用Visual Studio中的对象浏览器查看System.TimeZoneInfo的成员。

我在控制器的索引ActionResult和索引视图中的html帮助程序中测试了以下内容。 再一次,这只是为了帮助您看到自己的方式超越“很多工作”块,您似乎感到不舒服。

我已经使用c#编写了这段代码,但我确信你在VB中创建等效代码没有问题。

[控制器]

// Sample code from the article.
// Note: the collection only contains full hour offsets (i.e. New Delhi is in a half hour zone)
ReadOnlyCollection<TimeZoneInfo> tzCollection;
tzCollection = TimeZoneInfo.GetSystemTimeZones();

foreach (TimeZoneInfo timeZone in tzCollection)
    {
        Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName);
    }

// My modified version of its use.
// this code will create a dropdownlist with all the timezones available on my machine.
var theTimesInfo = new List<TimeZoneInfo>(tzCollection);
var theZones = new SelectList(theTimesInfo, "Id", "DisplayName", 1);

ViewData["theZones"] = theZones;

string myLocalZone = "Eastern Standard Time";
TimeZoneInfo myLocalDateTime = TimeZoneInfo.FindSystemTimeZoneById(myLocalZone);

string theZoneSelected = Request.QueryString.Get("theZones");
if (theZoneSelected == string.Empty || theZoneSelected == null)
{
    theZoneSelected = myLocalZone;
}

TimeZoneInfo selectedTimeZone = TimeZoneInfo.FindSystemTimeZoneById(theZoneSelected);
DateTime CurrentTimeZoneDateAndTime = TimeZoneInfo.ConvertTime((DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified)), myLocalDateTime, selectedTimeZone);

ViewBag.CurrentTimeZoneSelected = selectedTimeZone.DisplayName.ToString();
ViewBag.CurrentDateTimeSelected = CurrentTimeZoneDateAndTime.ToString();

[更新]编辑了视图代码以显示返回的值。

[查看]

<p>
    The Select TimeZone is: @ViewBag.CurrentTimeZoneSelected<br />
    The current Date and Time for the Selected TimeZone is: @ViewBag.CurrentDateTimeSelected
</p>

<form>
    @Html.DropDownList("theZones", ViewData["theZones"] as SelectList)
    <input type="submit" name="submit" value="Select This Time Zone" />
</form>

您可以使用foreach循环遍历集合并将其添加到db表中。 然后,如果需要,可以在表格中添加单个条目,或根据需要调整+ - 。

答案 1 :(得分:1)

您可以使用datetime.UtcNow。

将时间保存为UTC时间

您可以使用TimeZoneInfo.ConvertTime转换到其他国家/地区的时区,就像您在示例中所做的那样,转换为Now或UtcNow日期。

问题似乎是如何获取所有时区信息。你可以用GetSystemTimeZones做到这一点。官方时区名称为timeZoneInfo.id。

Dim zones As System.Collections.ObjectModel.ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones()
Dim hSpan As TimeSpan

For Each zone As TimeZoneInfo In zones
  If InStr(LCase(zone.Id), "greenland") > 0 Then
    ' zone has the timezoneinfo for greenland.
    ' the following line assigns hSpan the difference between Greenland time and UTC.
    ' Be careful -- there may be more than one Greenland time. A combo box would be safer.
    hSpan = zone.GetUtcOffset(Now)
    exit for
  End If
Next zone

您可以在Javascript中获取客户端浏览器的当前时区偏移量,如下所示:

function GetClientUTC()
{
var now = new Date();
var offset = now.getTimezoneOffset();
}