Warum kann es das nicht analysieren:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC")
Warum kann es das nicht analysieren:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC")
Antworten:
Diese Zeichenfolge kann nicht analysiert werden, da "UTC" kein gültiger Zeitzonenbezeichner ist.
Die UTC-Zeit wird durch Hinzufügen eines 'Z' am Ende der Zeitzeichenfolge angegeben. Ihr Parsing-Code sollte also folgendermaßen aussehen:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00Z");
Aus dem Wikipedia-Artikel zu ISO 8601
Wenn die Zeit in UTC ist, fügen Sie direkt nach der Zeit ohne Leerzeichen ein 'Z' hinzu. 'Z' ist die Zonenbezeichnung für den Null-UTC-Offset. "09:30 UTC" wird daher als "09: 30Z" oder "0930Z" dargestellt. "14:45:15 UTC" wäre "14: 45: 15Z" oder "144515Z".
Die UTC-Zeit wird auch als "Zulu" -Zeit bezeichnet, da "Zulu" das phonetische Alphabet der NATO für "Z" ist.
DateTime
mit einem Kind
von Local
und einem angepassten Zeitstempel zurückgegeben. Um immer UTC zu erhalten DateTime
, kann man eines verwenden DateTime.Parse("2008-01-01 00:00:00Z", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal)
, wie @crokusek vorschlägt, oder DateTimeOffset.Parse("2008-01-01 00:00:00Z").UtcDateTime
, wie @ruffin vorschlägt.
http-equiv="last-modified"
dem Format 2013-10-23 @ 17: 23: 00 UTC möglich?
Angenommen, Sie verwenden das Format "o" für Ihre Datumszeit, sodass Sie "2016-07-24T18: 47: 36Z" haben, gibt es eine sehr einfache Möglichkeit, dies zu handhaben.
Rufen Sie an DateTime.Parse("2016-07-24T18:47:36Z").ToUniversalTime()
.
Wenn Sie anrufen, erhalten DateTime.Parse("2016-07-24T18:47:36Z")
Sie eine DateTime
Einstellung für die lokale Zeitzone. Es konvertiert es also in die Ortszeit.
Das ToUniversalTime()
ändert es in eine UTC DateTime
und konvertiert es zurück in die UTC-Zeit.
Verwenden Sie einfach das:
var myDateUtc = DateTime.SpecifyKind(DateTime.Parse("Tue, 1 Jan 2008 00:00:00"), DateTimeKind.Utc);
if (myDateUtc.Kind == DateTimeKind.Utc)
{
Console.WriteLine("Yes. I am UTC!");
}
Sie können diesen Code mit dem Online-C # -Compiler testen:
Ich hoffe, es hilft.
Sie müssen das Format angeben:
DateTime date = DateTime.ParseExact(
"Tue, 1 Jan 2008 00:00:00 UTC",
"ddd, d MMM yyyy HH:mm:ss UTC",
CultureInfo.InvariantCulture);
oder verwenden Sie den AdjustToUniversal DateTimeStyle in einem Aufruf von
DateTime.ParseExact(String, String[], IFormatProvider, DateTimeStyles)
Verwenden Sie Folgendes, um die in der Frage angegebene Zeichenfolge korrekt zu analysieren, ohne sie zu ändern:
using System.Globalization;
string dateString = "Tue, 1 Jan 2008 00:00:00 UTC";
DateTime parsedDate = DateTime.ParseExact(dateString, "ddd, d MMM yyyy hh:mm:ss UTC", CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal);
Diese Implementierung verwendet eine Zeichenfolge, um das genaue Format der Datumszeichenfolge anzugeben, die analysiert wird. Der Parameter DateTimeStyles wird verwendet, um anzugeben, dass die angegebene Zeichenfolge eine koordinierte universelle Zeitzeichenfolge ist.
Kind
Eigenschaft des zurückgegebenen DateTime
Wertes DateTimeKind.Local
". ParseExact analysiert es korrekt als UTC, konvertiert es dann jedoch in die Ortszeit, bevor es zurückgegeben wird. Verwenden DateTimeStyles.RoundtripKind
Sie diese Option, wenn der zurückgegebene Wert unverändert als UTC zurückgegeben werden soll.
Es ist kein gültiges Format, jedoch "Di, 1. Januar 2008 00:00:00 GMT".
Die Dokumentation sagt so:
Eine Zeichenfolge, die Zeitzoneninformationen enthält und ISO 8601 entspricht. Beispielsweise bezeichnet die erste der folgenden beiden Zeichenfolgen die koordinierte Weltzeit (UTC). Die zweite bezeichnet die Zeit in einer Zeitzone sieben Stunden vor UTC:
2008-11-01T19: 35: 00.0000000Z
Eine Zeichenfolge, die den GMT-Bezeichner enthält und dem RFC 1123-Zeitformat entspricht. Zum Beispiel:
Sa, 01. November 2008 19:35:00 GMT
Eine Zeichenfolge, die Datum und Uhrzeit sowie Informationen zum Zeitzonenversatz enthält. Zum Beispiel:
03/01/2009 05:42:00 -5: 00
DateTime
mit einem Kind
von Local
für mich zurückgibt . Es sieht so aus, als ob die Problemumgehung darin besteht, DateTimeOffset.Parse (und dann x.UtcDateTime
) zu verwenden, wenn Sie sicherstellen möchten, dass Sie während der Analyse nicht vom UTC-Wagen fallen.
Ersetzen Sie einfach "UTC" durch "GMT" - einfach und bricht nicht korrekt formatierte Daten:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC".Replace("UTC", "GMT"))
Ich habe eine Dienstprogrammmethode zusammengestellt, die alle hier gezeigten Tipps und einige weitere verwendet:
static private readonly string[] MostCommonDateStringFormatsFromWeb = {
"yyyy'-'MM'-'dd'T'hh:mm:ssZ", // momentjs aka universal sortable with 'T' 2008-04-10T06:30:00Z this is default format employed by moment().utc().format()
"yyyy'-'MM'-'dd'T'hh:mm:ss.fffZ", // syncfusion 2008-04-10T06:30:00.000Z retarded string format for dates that syncfusion libs churn out when invoked by ejgrid for odata filtering and so on
"O", // iso8601 2008-04-10T06:30:00.0000000
"s", // sortable 2008-04-10T06:30:00
"u" // universal sortable 2008-04-10 06:30:00Z
};
static public bool TryParseWebDateStringExactToUTC(
out DateTime date,
string input,
string[] formats = null,
DateTimeStyles? styles = null,
IFormatProvider formatProvider = null
)
{
formats = formats ?? MostCommonDateStringFormatsFromWeb;
return TryParseDateStringExactToUTC(out date, input, formats, styles, formatProvider);
}
static public bool TryParseDateStringExactToUTC(
out DateTime date,
string input,
string[] formats = null,
DateTimeStyles? styles = null,
IFormatProvider formatProvider = null
)
{
styles = styles ?? DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal; //0 utc
formatProvider = formatProvider ?? CultureInfo.InvariantCulture;
var verdict = DateTime.TryParseExact(input, result: out date, style: styles.Value, formats: formats, provider: formatProvider);
if (verdict && date.Kind == DateTimeKind.Local) //1
{
date = date.ToUniversalTime();
}
return verdict;
//0 employing adjusttouniversal is vital in order for the resulting date to be in utc when the 'Z' flag is employed at the end of the input string
// like for instance in 2008-04-10T06:30.000Z
//1 local should never happen with the default settings but it can happen when settings get overriden we want to forcibly return utc though
}
Beachten Sie die Verwendung von '-' und 'T' (in einfachen Anführungszeichen). Dies geschieht als bewährte Methode, da regionale Einstellungen die Interpretation von Zeichen wie '-' beeinträchtigen und dazu führen, dass sie als '/' oder 'interpretiert werden. oder was auch immer Ihre regionalen Einstellungen als Datums-Komponenten-Trennzeichen bezeichnen. Ich habe auch eine zweite Dienstprogrammmethode hinzugefügt, die zeigt, wie die am häufigsten verwendeten Datumszeichenfolgenformate analysiert werden, die von Web-Clients an Rest-API-Backends gesendet werden. Genießen.
new Date().toUTCString()
in Javascript