有谁知道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之前的整数。
提前致谢!
答案 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