天道酬勤,学无止境

RFC-1123 的日期时间给出了不准确的时区(DateTime to RFC-1123 gives inaccurate timezone)

问题

如果我得到 DateTime 对象的 RFC-1123 格式日期,它会给出当前本地时间,但将时区给出为 GMT(这是不准确的)。
DateTime.Now.ToString("r");
返回
Fri, 12 Feb 2010 16:23:03 GMT

下午 4:23,但我的时区是 UTC+10(另外,我们目前正在遵守夏令时)。

现在,我可以通过首先转换为 UTC 来获得“正确”的返回值:
DateTime.UtcNow.ToString("r");
返回
Fri, 12 Feb 2010 05:23:03 GMT

但是,理想情况下,我想获得正确的时区,我想应该是
Fri, 12 Feb 2010 16:23:03 +1100

传入当前的 CultureInfo 不会改变任何东西。 我可以使用 TimeZoneInfo.Local.GetUtcOffset(...) 获得 UTC 偏移量并从中格式化时区字符串,但是去掉 GMT 位并替换它似乎无缘无故地混乱。

有没有办法强制它包含正确的时区?

回答1

.NET 实现始终将结果表示为 GMT,而不管实际日期的时间偏移。

通过使用DateTime.Now.ToString("r"); 你实际上是在说String.Format("ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", DateTime.Now); ,这是 .NET RFC1123 格式字符串,如 MSDN 所示 - RFC1123 ("R", "r") 格式说明符。

要获得所需的行为,您可能应该使用String.Format ,并将说明符的固定“GMT”部分替换为时间偏移说明符:

  • “z”自定义格式说明符
  • “zz”自定义格式说明符
  • “zzz”自定义格式说明符
回答2

你可以只做DateTime.UtcNow.ToString ("R") ,你仍然会得到 GMT 时区,但时间是正确偏移的。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在C#、. Net 4.0中解析RFC1123格式的日期(Parsing RFC1123 formatted dates in C#, .Net 4.0)
    问题 我正在尝试以RFC1123格式解析日期(2010年1月21日,星期四,美国东部标准时间)。 这是我尝试过的,但是没有用: DateTime Date = DateTime.Parse(dt); DateTime Date = DateTime.ParseExact(dt, "r", null); 回答1 您是否尝试过类似的方法: string dateString, format; DateTime result; CultureInfo provider = CultureInfo.InvariantCulture; dateString = "Thu, 21 Jan 2010 17:47:00 EST"; format = "ddd, dd MMM yyyy hh:mm:ss EST"; result = DateTime.ParseExact(dateString, format, provider); Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 我还没有测试(过一会儿)...但是我相信它将为您做到这一点。 编辑:似乎问题在于RFC1123指出时区应始终为GMT ...这就是为什么r或R不能为您提供格式的原因。 问题是EST。 上面的模式说明了EST,但它是静态的
  • DateTimeStyles.RoundtripKind 枚举是什么意思?(What does DateTimeStyles.RoundtripKind enumeration mean?)
    问题 我在这里阅读了回答者的帖子,在那里我遇到了我试图理解的枚举值DateTimeStyles.RoundtripKind 。 我在这里查看了 MSDN,其中说: 当使用“o”或“r”标准格式说明符将 DateTime 对象转换为字符串时,日期的 DateTimeKind 字段将被保留,然后该字符串被转换回 DateTime 对象。 我参考的帖子中输入的时间戳是这样的: <timestamp time='2016-09-16T13:45:30'> 我运行了她的代码,它仍然有效。 现在连接我拥有的所有信息都是一团糟: 上面的时间戳包含一些标识符T MSDN 文档讨论了o和r格式说明符,但没有说明它是什么? 如果您在我上面引用的 MSDN 链接上深入了解DateTimeKind枚举的更多详细信息,它没有说明o和r格式说明符。 这是链接,上面写着: Member Name | Description -------------------------------------------------------------------------------- Local | The time represented is local time. Unspecified | The time represented is not specified as either local time
  • 使用C#和.net 3.5阅读RSS时出现问题(Problems Reading RSS with C# and .net 3.5)
    问题 我一直在尝试使用System.ServiceModel.Syndication中提供的新例程编写一些例程来读取RSS和ATOM提要,但不幸的是,Rss20FeedFormatter炸掉了我尝试的大约一半的提要,但有以下例外: An error was encountered when parsing a DateTime value in the XML. 每当RSS源以以下格式表示发布日期时,似乎就会发生这种情况: 星期四,08年10月16日14:23:26 -0700 如果供稿将发布日期表示为格林尼治标准时间,则表示一切正常: 2008年10月16日,星期四,格林尼治标准时间 如果有某种方法可以解决XMLReaderSettings的问题,那么我还没有找到它。 有人可以协助吗? 回答1 序列化pubDate和lastBuildDate等元素时,RSS 2.0格式的联合供稿源使用RFC 822日期时间规范。 不幸的是,RFC 822日期时间规范是一种非常“灵活”的语法,用于表示DateTime的时区成分。 可以以几种方式指示时区。 “ UT”是世界标准时间(以前称为“格林威治标准时间”); 允许使用“ GMT”作为世界标准时间的参考。 军事标准在每个区域使用一个字符。 “ Z”是世界标准时间。 “ A”表示提前一小时,“ M”表示提前十二小时; “ N”是一小时后,而“ Y
  • SimpleDateFormat 解析需要一小时(夏季使用 RFC 1123,GMT)(SimpleDateFormat parse is one hour out (using RFC 1123, GMT in summer))
    问题 我使用 SimpleDateFormat 和 RFC 1123 来格式化日期和解析日期。 但是, parse(format(date)) 有时与原始日期相差一小时。 下面的代码: public static void main(String[] args) throws ParseException { String RFC1123_DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss zzz"; SimpleDateFormat dateFormat = new SimpleDateFormat(RFC1123_DATE_PATTERN); Date date = new Date(1000); String str = dateFormat.format(date); Date date2 = dateFormat.parse(str); System.out.println("date="+date+"; "+date.getTime()); System.out.println("str="+str); System.out.println("date2="+date2+"; "+date2.getTime()); } 写出: date=Thu Jan 01 01:00:01 GMT 1970; 1000 str=Thu, 01 Jan
  • Chrome 不发送“If-Modified-Since”(Chrome doesn't send “If-Modified-Since”)
    问题 我希望浏览器始终添加(第一次除外)“If-Modified-Since”请求标头以避免不必要的流量。 响应头是: Accept-Ranges:bytes Cache-Control:max-age=0, must-revalidate Connection:Keep-Alive Content-Length:2683 Content-Type:text/html; charset=UTF-8 Date:Thu, 05 Apr 2012 13:06:19 GMT Keep-Alive:timeout=15, max=497 Last-Modified:Thu, 05 Apr 2012 13:05:11 GMT Server:Apache/2.2.21 (Red Hat) FF 11 和 IE 9 都发送“If-Modified-Since”并得到 304 作为响应,但 Chrome 18 没有并得到 200。 为什么? 如何强制 Chrome 发送“If-Modified-Since”标头? 我不知道它是否重要,但所有请求都通过 HTTPS。 回答1 我一直在追这个问题一段时间,以为我会分享我的发现。 “规则实际上很简单:证书的任何错误都意味着该页面将不会被缓存。” https://code.google.com/p/chromium/issues/detail?id
  • 在Android中更改日期字符串格式(Change date string format in android)
    问题 我正在从SAX解析中获取日期字符串,如下所示:周三,2012年4月18日07:55:29 +0000 现在,我希望此字符串为: 2012年4月18日,下午01:25 我怎样才能做到这一点? 回答1 SimpleDateFormat format = new SimpleDateFormat("MMM dd,yyyy hh:mm a"); String date = format.format(Date.parse("Your date string")); 更新 :- 如上所示, Date.parse("Your date string"); 不推荐使用。 String strCurrentDate = "Wed, 18 Apr 2012 07:55:29 +0000"; SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss Z"); Date newDate = format.parse(strCurrentDate); format = new SimpleDateFormat("MMM dd,yyyy hh:mm a"); String date = format.format(newDate); 回答2 可以做到这一点: public static String
  • 字符串日期至今[重复](String date to date [duplicate])
    问题 这个问题在这里已经有了答案: 在 Go 中解析日期字符串8 个回答 2年前关闭。 如何将字符串日期格式转换为日期,我有格式为的日期字符串 YYYY-MM-DD 以下我尝试没有运气。 t, err := time.Parse("%Y-%m-%d", "2011-01-19") t, err := time.Parse("YYYY-MM-DD", "2011-01-19") t, err := time.Parse("2016-01-20", "2011-01-19") 以上所有语句都给出了解析错误。 回答1 请阅读 time.Parse 的文档: 布局通过显示如何定义参考时间来定义格式 2006 年 1 月 2 日星期一 15:04:05 -0700 MST 如果它是值,将被解释; 它作为输入格式的一个例子。 然后将对输入字符串进行相同的解释。 所以正确的格式是 t, err := time.Parse("2006-01-02", "2011-01-19") 回答2 除了使用文字2006-01-02时间格式之外,您还可以通过创建一个类似于 Go 在time包中所做的常量来减少错误。 YYYY-MM-DD格式在 RFC-3339 中定义为full-date如下(顺序调整): full-date = date-fullyear "-" date-month "-" date
  • PHP中的NOW()函数(NOW() function in PHP)
    问题 是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间? 我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。 例如,返回: 2009-12-01 00:00:00 回答1 除了日期功能外: date("Y-m-d H:i:s"); 回答2 date('Y-m-d H:i:s') 在这里查看更多详细信息:http://pl.php.net/manual/en/function.date.php 回答3 使用PHP版本> = 5.4 DateTime可以做到这一点: echo (new \DateTime())->format('Y-m-d H:i:s'); 看到它的工作。 回答4 使用此功能: function getDatetimeNow() { $tz_object = new DateTimeZone('Brazil/East'); //date_default_timezone_set('Brazil/East'); $datetime = new DateTime(); $datetime->setTimezone($tz_object); return $datetime->format('Y\-m\-d\ h:i:s'); } 回答5 简短答案 $now = date_create()->format('Y-m-d H:i
  • 用PHP解析法语日期(Parse french date in php)
    问题 我有字符串: “ 2013年7月8日,星期一,09:09” 如何解析此类型的字符串? 我尝试: $date = '08 Juillet 2013 09:09'; $date = new \DateTime($date); 但是它抛出异常 回答1 $date = '08 Juillet 2013 09:09';; $find = array('janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'); $replace = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); $date = str_replace($find, $replace, strtolower($date)); date = date('Y/m/d', strtotime($date)); 回答2 intl扩展名可用于此目的: // create formatter $fmt = new IntlDateFormatter
  • 如何进行日期/时间比较(How to do date/time comparison)
    问题 在Go中进行日期比较是否有任何选择? 我必须根据日期和时间-独立地对数据进行排序。 因此,我可以允许一个对象在一定日期范围内发生,只要它也在一定时间范围内出现即可。 在这种模型中,我不能简单地选择最旧的日期,最年轻的时间/最新的日期,最新的时间和Unix()秒来比较它们。 我真的很感谢任何建议。 最终,我编写了一个时间解析字符串比较模块,以检查时间是否在范围内。 但是,这进展不顺利。 我有一些令人毛骨悚然的问题。 我将其发布在这里只是为了好玩,但我希望有一种更好的时间比较方法。 package main import ( "strconv" "strings" ) func tryIndex(arr []string, index int, def string) string { if index <= len(arr)-1 { return arr[index] } return def } /* * Takes two strings of format "hh:mm:ss" and compares them. * Takes a function to compare individual sections (split by ":"). * Note: strings can actually be formatted like "h", "hh", "hh:m"
  • DateTime to RFC-1123 gives inaccurate timezone
    If I get the RFC-1123 formatted date of a DateTime object, it gives the current local time, but gives the timezone as GMT (which is inaccurate). DateTime.Now.ToString("r"); returns Fri, 12 Feb 2010 16:23:03 GMT At 4:23 in the afternoon, but my timezone is UTC+10 (plus, we're currently observing daylight saving time). Now, I can get a return value that's "correct" by converting to UTC first: DateTime.UtcNow.ToString("r"); returns Fri, 12 Feb 2010 05:23:03 GMT However, ideally, I'd like to get the right timezone, which I guess would be Fri, 12 Feb 2010 16:23:03 +1100 Passing in the current
  • 如何解析日期时间并将其转换为RFC 822日期时间格式?(How do I parse and convert DateTime’s to the RFC 822 date-time format?)
    问题 如何将DateTime结构转换为其等效的RFC 822日期时间格式的字符串表示形式,并将此字符串表示形式解析回.NET中的DateTime结构? RFC-822日期时间格式用于多种规范,例如RSS联合格式。 回答1 试试这个: DateTime today = DateTime.Now; String rfc822 = today.ToString("r"); Console.WriteLine("RFC-822 date: {0}", rfc822); DateTime parsedRFC822 = DateTime.Parse(rfc822); Console.WriteLine("Date: {0}", parsedRFC822); 传递到DateTime的ToString()方法中的“ r”格式说明符实际上会产生RFC-1123格式的日期时间字符串,但也会基于RFC-822日期传递,这是基于阅读位于http://www.w3的规范。 org / Protocols / rfc822 /#z28。 我在创建RSS feed时使用了这种方法,并且它们通过基于http://validator.w3.org/feed/check.cgi上提供的验证器的验证。 缺点是,在转换中,它将日期时间转换为格林尼治标准时间。 要转换回本地时间,您需要应用本地时区偏移量。 为此
  • 将UTC字符串转换为时间对象(Convert UTC string to time object)
    问题 我有这个日期时间,或者看起来像它的东西。 2014-11-17 23:02:03 +0000 UTC 我想将其转换为时间对象,但我一直无法从time.Parse产生任何输出,除了: 0001-01-01 00:00:00 +0000 UTC 我试过这些布局: time.RFC3339 0001-01-01 00:00:00 0000 UTC 2016-10-10 time.UnixDate 还有一些 - 没有一个奏效。 这就是我调用parse : updatedAt, err := time.Parse(time.UnixDate, updatedAtVar) 如何从字符串创建时间对象? 回答1 很可能您使用了错误的布局,并且您没有检查返回的错误。 布局必须是此日期/时间,格式为您的输入时间: Mon Jan 2 15:04:05 -0700 MST 2006 请参阅此工作代码: layout := "2006-01-02 15:04:05 -0700 MST" t, err := time.Parse(layout, "2014-11-17 23:02:03 +0000 UTC") fmt.Println(t, err) 输出(在 Go Playground 上试试): 2014-11-17 23:02:03 +0000 UTC <nil> 编辑: 在您的问题中
  • 日期格式yyyy-MM-ddTHH:mm:ssZ(date format yyyy-MM-ddTHH:mm:ssZ)
    问题 我认为这应该很简单,但无法获得它:( .. Z是时区。 T是长时间模式我如何以这种格式获取日期,除非使用 DateTime dt = DateTime.Now; Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ssZ")); 在C#中 回答1 使用UTC ISO 8601(MSDN日期时间格式) Console.WriteLine(DateTime.UtcNow.ToString("s") + "Z"); 2009-11-13T10:39:35Z Z在那是因为 如果时间以世界标准时间(UTC)为单位,请在时间之后直接添加“ Z”,且不带空格。 “ Z”是UTC零偏移量的区域标记。 因此,“ 09:30 UTC”表示为“ 09:30Z”或“ 0930Z”。 “ 14:45:15 UTC”将是“ 14:45:15Z”或“ 144515Z”。 如果要包括偏移量 int hours = TimeZoneInfo.Local.BaseUtcOffset.Hours; string offset = string.Format("{0}{1}",((hours >0)? "+" :""),hours.ToString("00")); string isoformat = DateTime.Now.ToString("s") + offset
  • 将 YYYYMMDD 字符串转换为 Go 中的有效日期(convert YYYYMMDD string to a valid date in Go)
    问题 我想将字符串"20101011"转换为有效日期 ( 2010-10-11 ),但无法弄清楚我们该怎么做。 我试过了: now := time.Now() date := now.Format("20101011") 和 date, _ := time.Parse("20101011", "20101011") 没有一个工作。 回答1 打包时间import "time" 常数const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone RFC850 = "Monday, 02-Jan-06 15:04:05 MST" RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST" RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone RFC3339 = "2006-01-02T15:04
  • C#DateTime转换为“ YYYYMMDDHHMMSS”格式(C# DateTime to “YYYYMMDDHHMMSS” format)
    问题 我想将C#日期时间转换为“ YYYYMMDDHHMMSS”格式。 但是我没有找到获取这种格式的内置方法吗? 任何意见? 回答1 DateTime.Now.ToString("yyyyMMddHHmmss"); // case sensitive 回答2 这个网站有很棒的例子来看看 // create date time 2008-03-09 16:05:07.123 DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123); String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day String.Format("{0:h hh H HH}", dt); // "4 04 16 16" hour 12/24 String.Format("{0:m mm}", dt); // "5 05" minute String.Format("{0:s ss}", dt); // "7 07" second
  • 为什么DateTime.Parse无法解析UTC日期(Why can't DateTime.Parse parse UTC date)
    问题 为什么它不能解析此: DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC") 回答1 无法解析该字符串,因为“ UTC”不是有效的时区指示符。 UTC时间是通过在时间字符串的末尾添加“ Z”来表示的,因此您的解析代码应如下所示: DateTime.Parse("Tue, 1 Jan 2008 00:00:00Z"); 摘自ISO 8601上的Wikipedia文章 如果时间以世界标准时间(UTC)为准,请在时间之后直接添加“ Z”,且不带空格。 “ Z”是UTC零偏移量的区域标记。 因此,“ 09:30 UTC”表示为“ 09:30Z”或“ 0930Z”。 “ 14:45:15 UTC”将是“ 14:45:15Z”或“ 144515Z”。 UTC时间也称为“祖鲁语”时间,因为“祖鲁语”是北约语音字母中的“ Z”。 回答2 假设您为日期时间使用格式“ o”,那么您就拥有“ 2016-07-24T18:47:36Z”,有一种非常简单的方法可以处理此问题。 调用DateTime.Parse("2016-07-24T18:47:36Z").ToUniversalTime() 。 当您调用DateTime.Parse("2016-07-24T18:47:36Z") ,会发生一个将DateTime设置为本地时区的情况。 因此,它将其转换为当地时间。
  • 如何解析JSON以在JavaScript中接收Date对象?(How to parse JSON to receive a Date object in JavaScript?)
    问题 我有以下一段JSON: \/Date(1293034567877)\/ 这是此.NET代码的结果: var obj = DateTime.Now; var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); serializer.Serialize(obj).Dump(); 现在,我面临的问题是如何在JavaScript中从中创建Date对象。 我所能找到的就是令人难以置信的正则表达式解决方案(许多包含错误)。 很难相信没有完美的解决方案,因为这都是JavaScrip中的全部,我的意思是JavaScript代码试图读取应该被认为是JavaScript代码的JSON(JavaScript对象表示法),但现在看来,这并不是因为JavaScript无法在这里做好。 我还看到了一些我无法使用的评估解决方案(除了被指出为安全威胁之外)。 真的没有办法优雅地做到这一点吗? 没有实际答案的类似问题: 如何使用GWT解析ASP.NET JSON日期格式 回答1 没有日期的标准JSON表示形式。 您应该执行@jAndy建议的操作,而不要完全序列化DateTime ; 只需发送RFC 1123日期字符串ToString("r")或从Unix纪元开始的秒数
  • 正确的Javascript Date.parse(…)格式字符串?(The correct Javascript Date.parse(…) format string?)
    问题 构造字符串以便Javascript Date()构造函数可以解析它并创建适当的date对象的文化不变方法是什么? 我已经尝试了以下无效的格式字符串(使用C#生成字符串): clientDate.ToString(); // gives: "11/05/2009 17:35:23 +00:00" clientDate.ToString("MMM' 'dd', 'yyyy' 'h':'mm':'ss' 'tt"); // works on an English server // but on a French server, gives: "mai 11, 2009 5:35:23" // Javascript won't parse that. clientDate.ToString("MM'-'dd'-'yyyy' 'HH':'mm':'ss") // gives: 05-11-2009 17:35:23 什么是通用格式? 回答1 根据MDC: 给定一个表示时间的字符串, parse返回时间值。 它接受IETF标准(RFC 1123第5.2.14节和其他地方)的日期语法: "Mon, 25 Dec 1995 13:30:00 GMT" 。 它可以理解美国大陆时区的缩写,但是对于一般用途,请使用时区偏移量,例如"Mon, 25 Dec 1995 13:30:00 GMT
  • JavaScript日期函数在Firefox浏览器中返回“ Date {Invalid Date}”(JavaScript date function returns “Date {Invalid Date}” in Firefox browser)
    问题 面对JavaScript Date函数的问题,在Firefox浏览器中returns "Date {Invalid Date}" ,但在Google chrome中可以正常使用。 // My Input is new Date("Sat Jan 01 00:00:00 EST 1"); // Works fine in google chrome // Result: Mon Jan 01 2001 10:30:00 GMT+0530 (India Standard Time) // Not working in Firefox (Version: 15.0.1) // Result: Date {Invalid Date} 回答1 Date不会采用这种方式的时区参数。 我的想法是Chrome只是忽略它。 new Date(year, month, day [, hour, minute, second, millisecond]) 有关更多信息,请参见下面的@Brett评论。 回答2 这适用于所有浏览器- 新日期(“ 2001/01/31 12:00:00 AM”) 回答3 确保该参数符合RFC1123:http://tools.ietf.org/html/rfc1123