RTF日期戳在.NET中转换为DateTime格式,反之亦然

时间:2014-04-17 07:30:20

标签: date rtf richtext

有谁知道RTF中的日期时间格式代表哪个日期戳?

例如: 如果您在Word文档中注释日期为" 1970-01-01T00:00:00"并且您以富文本格式文档导出文档,上面的DateTime将被解析为:" -2074015744"。

如果RTF中的日期在UNIX时间表示,那么它应该是" 0000000000",所以我认为这不是正确的格式。

更具体一点:我们假设我们有RTF文档的以下部分:

{\*\atrfstart 37360238}{\*\atrfend 37360238}{\*\atnid JD}{\*\atnauthor John Doe}\chatn{\*\annotation{\*\atnref 37360238}{\*\atndate 1730446516}\pard\s0\ltrpar\sl276\slmult1{\ltrch\i0\b0\strike0\ulnone sample comment}{\ltrch\i0\b0\strike0\ulnone\par}}

注释的日期由{* \ atndate 1730446516}组表示。我们想要以DateTime格式解析控制字\ atndate之前的整数。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我为此努力,并发现LibreOffice的人们解决了这个问题。这个问题涉及很多比特转换。 1970年的负数是整数无符号/有符号误解。

https://docs.libreoffice.org/sw/html/writerwordglue_8cxx_source.html

的第726行
  726 long DateTime2DTTM( const DateTime& rDT )
  727         {
  728         /*
  729         mint    short   :6  0000003F    minutes (0-59)
  730         hr      short   :5  000007C0    hours (0-23)
  731         dom     short   :5  0000F800    days of month (1-31)
  732         mon     short   :4  000F0000    months (1-12)
  733         yr      short   :9  1FF00000    years (1900-2411)-1900
  734         wdy     short   :3  E0000000    weekday(Sunday=0
  735                                                 Monday=1
  736         ( wdy can be ignored )                  Tuesday=2
  737                                                 Wednesday=3
  738                                                 Thursday=4
  739                                                 Friday=5
  740                                                 Saturday=6)
  741         */
  742 
  743             if ( rDT.GetDate() == 0L )
  744                 return 0L;
  745             long nDT = ( rDT.GetDayOfWeek() + 1 ) % 7;
  746             nDT <<= 9;
  747             nDT += ( rDT.GetYear() - 1900 ) & 0x1ff;
  748             nDT <<= 4;
  749             nDT += rDT.GetMonth() & 0xf;
  750             nDT <<= 5;
  751             nDT += rDT.GetDay() & 0x1f;
  752             nDT <<= 5;
  753             nDT += rDT.GetHour() & 0x1f;
  754             nDT <<= 6;
  755             nDT += rDT.GetMin() & 0x3f;
  756             return nDT;
  757         }
  758