我必须显示日期&根据用户时区ID给用户的时间。我不能依赖用户的电脑日期时间和设置。我正在寻找谷歌的方式,并获得了以下代码。代码似乎将查询许多外部服务器的日期和&时间但有一点我不清楚什么样的日期&我可以从以下代码中获得时间。
有一段时间我需要印度时间。有一段时间我需要伦敦时间,有些时候我需要其他国家的当地时间。几个县有很多时区,这就是为什么我想发送时区ID /名称,并希望根据时区ID /名称获取日期时间。所以只需指导我如何自定义下面的代码,我可以发送用户的时区ID,例程将根据时区ID返回正确的本地时间,即使用户的pc日期时间设置错误。寻求好帮助。感谢
public static DateTime GetFastestNISTDate()
{
var result = DateTime.MinValue;
// Initialize the list of NIST time servers
// http://tf.nist.gov/tf-cgi/servers.cgi
string[] servers = new string[] {
"nist1-ny.ustiming.org",
"nist1-nj.ustiming.org",
"nist1-pa.ustiming.org",
"time-a.nist.gov",
"time-b.nist.gov",
"nist1.aol-va.symmetricom.com",
"nist1.columbiacountyga.gov",
"nist1-chi.ustiming.org",
"nist.expertsmi.com",
"nist.netservicesgroup.com"
};
// Try 5 servers in random order to spread the load
Random rnd = new Random();
foreach (string server in servers.OrderBy(s => rnd.NextDouble()).Take(5))
{
try
{
// Connect to the server (at port 13) and get the response
string serverResponse = string.Empty;
using (var reader = new StreamReader(new System.Net.Sockets.TcpClient(server, 13).GetStream()))
{
serverResponse = reader.ReadToEnd();
}
// If a response was received
if (!string.IsNullOrEmpty(serverResponse))
{
// Split the response string ("55596 11-02-14 13:54:11 00 0 0 478.1 UTC(NIST) *")
string[] tokens = serverResponse.Split(' ');
// Check the number of tokens
if (tokens.Length >= 6)
{
// Check the health status
string health = tokens[5];
if (health == "0")
{
// Get date and time parts from the server response
string[] dateParts = tokens[1].Split('-');
string[] timeParts = tokens[2].Split(':');
// Create a DateTime instance
DateTime utcDateTime = new DateTime(
Convert.ToInt32(dateParts[0]) + 2000,
Convert.ToInt32(dateParts[1]), Convert.ToInt32(dateParts[2]),
Convert.ToInt32(timeParts[0]), Convert.ToInt32(timeParts[1]),
Convert.ToInt32(timeParts[2]));
// Convert received (UTC) DateTime value to the local timezone
result = utcDateTime.ToLocalTime();
return result;
// Response successfully received; exit the loop
}
}
}
}
catch
{
// Ignore exception and try the next server
}
}
return result;
}
var wc = GetFastestNISTDate();
var pattern = InstantPattern.CreateWithInvariantCulture("dd/MM/yyyy HH:mm:ss");
var parseResult = pattern.Parse(wc.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture));
if (!parseResult.Success)
throw new InvalidDataException("...whatever...");
var instant = parseResult.Value;
var timeZone = DateTimeZoneProviders.Tzdb["Europe/London"];
var zonedDateTime = instant.InZone(timeZone);
var bclDateTime = zonedDateTime.ToDateTimeUnspecified();
时区翻译不起作用。我从这个函数GetFastestNISTDate();
得到了正确的日期,然后我尝试根据我的第一个utc时间得到不同时区的本地日期和时间,但代码返回错误的伦敦时间。我想我错了代码。任何人都可以看到&救命。感谢
答案 0 :(得分:3)
DateTime tzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, TimeZone);
希望这有帮助。
答案 1 :(得分:0)
时间服务器将报告UTC时间(这就是变量命名为utcDateTime
的原因)。
result = utcDateTime.ToLocalTime();
行根据计算机所在的时区将UTC时间从时间服务器转换为本地时间。如果您需要不同的时区,则需要更改该行。
如上所述,您可以使用TimeZoneInfo.ConvertTimeFromUtc转换为某个指定的时区。请参阅该页面上的示例。
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);