none
高手请教关于时间转换 RRS feed

  • 问题

  • 数据库里取出的时间如: 2009-04-19T11:00:00  这种形式。
    我想用 DateTimeOffset 这个类转出来 “Thu, 08 Oct 2009 23:16:31 GMT” 这种形式的怎么转?
    我现在只能转出来“Thu, 08 Oct 2009 23:16:31 +8000” 这样的, 而不能是“GMT”结尾的
    2009年10月9日 7:55

答案

  • 首先,你要清楚,你使用人家的类,具体的格式是什么样子,别人没有提供控制属性,你就控制不了,
    再次,你即使以 Thu, 08 Oct 2009 23:16:31 GMT 格式的时间来给 DateTimeOffset  赋值,得到的结果仍然不是 Thu, 08 Oct 2009 23:16:31 GMT 格式的,为什么会这样?就是因为 SyndicationItem 类不是你自己写的,所以你就控制不了。
    你可以使用下面的日期试试啊。
    DateTimeOffset lastModified = DateTimeOffset.Parse("Thu, 08 Oct 2009 23:16:31 GMT");

    看看 SyndicationItem是怎么保存的:使用 Reflector 你可以打开 System.ServiceModel.Web.dll 看看。可以看到下面的代码:

    if (item.PublishDate > DateTimeOffset.MinValue)
    {
        writer.WriteElementString("pubDate", "", this.AsString(item.PublishDate));
    }


    那么AsString是这样写的:

    private string AsString(DateTimeOffset dateTime)
    {
        if (dateTime.Offset == Atom10FeedFormatter.zeroOffset)
        {
            return dateTime.ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss Z", CultureInfo.InvariantCulture);
        }
        StringBuilder builder = new StringBuilder(dateTime.ToString("ddd, dd MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture));
        builder.Remove(builder.Length - 3, 1);
        return builder.ToString();
    }



    所以,你使用.NET 的 SyndicationFeed SyndicationItem来生成RSS的话,结果则可能是:

    <pubDate>2009-10-09T13:02:42Z</pubDate>
    或者
    <pubDate>2007-11-01T09:00:00+08:00</pubDate>



    要产生自己希望的格式,一个办法就是自己生成RSS 格式的xml
    【孟子E章】
    2009年10月9日 13:19
    版主

全部回复

  • DateTime.ToString("r");
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年10月9日 8:43
    版主
  • 能不能不用DateTime类,用DateTimeOffset类?
    2009年10月9日 9:14
  • 我觉得你要是纯显示或者交换数据用,后面的 GMT 你自己加上也可以,或者拼出这样的格式
    【孟子E章】
    2009年10月9日 9:23
    版主
  • 关键我返回的必须是 DateTimeOffset 类型的并且带GMT的
    2009年10月9日 9:28
  •       DateTimeOffset d =  new DateTimeOffset(2007, 11, 1, 9, 0, 0, new TimeSpan(-7, 0, 0));
          MessageBox.Show(d.ToString("r"));

    【孟子E章】
    2009年10月9日 9:38
    版主
  • d.ToString("r") 这个以后出来的就是string类型了, 我要DateTimeOffset 类型的,
    估计C#做不到这个吧,谢谢了, 我再想想。
    2009年10月9日 9:41
  • DateTimeOffset 本身表示的是一串数字,本身已经表示了这些信息,格式是显示用的。

    显示格式和数据内部格式是2回事

    你要显示出来,就要显式或隐式调用 ToString方法的

    【孟子E章】
    2009年10月9日 9:43
    版主
  • 事情是这样的,我要做个RSS,用了里面的 SyndicationItem 类,
     SyndicationItem item = new SyndicationItem();

    然后我要给个发行日期: item.PublishDate 但是这个PublishDate  是DateTimeOffset 类型的,

    然后我看了一下别人网站,出来的PublishDate  是 <pubDate>Fri, 09 Oct 2009 12:33:51 GMT</pubDate>,带GMT,的。

    一直不知道这个是怎么是想的,既要DateTimeOffset 类型又要带 GMT ??

    我做出来的是这样的  <pubDate>Sun, 19 Apr 2009 11:00:00 +0800</pubDate> 都是 +0800 形式,而不是GMT 形式
    2009年10月9日 9:51
  • 首先,你要清楚,你使用人家的类,具体的格式是什么样子,别人没有提供控制属性,你就控制不了,
    再次,你即使以 Thu, 08 Oct 2009 23:16:31 GMT 格式的时间来给 DateTimeOffset  赋值,得到的结果仍然不是 Thu, 08 Oct 2009 23:16:31 GMT 格式的,为什么会这样?就是因为 SyndicationItem 类不是你自己写的,所以你就控制不了。
    你可以使用下面的日期试试啊。
    DateTimeOffset lastModified = DateTimeOffset.Parse("Thu, 08 Oct 2009 23:16:31 GMT");

    看看 SyndicationItem是怎么保存的:使用 Reflector 你可以打开 System.ServiceModel.Web.dll 看看。可以看到下面的代码:

    if (item.PublishDate > DateTimeOffset.MinValue)
    {
        writer.WriteElementString("pubDate", "", this.AsString(item.PublishDate));
    }


    那么AsString是这样写的:

    private string AsString(DateTimeOffset dateTime)
    {
        if (dateTime.Offset == Atom10FeedFormatter.zeroOffset)
        {
            return dateTime.ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss Z", CultureInfo.InvariantCulture);
        }
        StringBuilder builder = new StringBuilder(dateTime.ToString("ddd, dd MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture));
        builder.Remove(builder.Length - 3, 1);
        return builder.ToString();
    }



    所以,你使用.NET 的 SyndicationFeed SyndicationItem来生成RSS的话,结果则可能是:

    <pubDate>2009-10-09T13:02:42Z</pubDate>
    或者
    <pubDate>2007-11-01T09:00:00+08:00</pubDate>



    要产生自己希望的格式,一个办法就是自己生成RSS 格式的xml
    【孟子E章】
    2009年10月9日 13:19
    版主
  • 谢谢楼上
    2009年10月10日 13:54