public void WriteSingleDateTime() { using (var stream = new MemoryStream()) using (var reader = new BinaryReader(stream)) { var now = new DateTime(635000000000000000).ToUniversalTime(); var root = new BSONDocument(); root.Set(new BSONDateTimeElement("now", now)); root.WriteAsBSON(stream); Assert.AreEqual(stream.Position, 18); // ensure document length is 18 bytes stream.Seek(0, SeekOrigin.Begin); CollectionAssert.AreEqual(reader.ReadBytes(4), BitConverter.GetBytes(18)); // ensure content length is 18 Assert.AreEqual(reader.ReadByte(), (byte) BSONElementType.DateTime); // ensure element type is DateTime 0x09 CollectionAssert.AreEqual(reader.ReadBytes(3), Encoding.UTF8.GetBytes("now")); // ensure element name is 'now' Assert.AreEqual(reader.ReadByte(), (byte) 0x00); // ensure string name terminator 0x00 is present CollectionAssert.AreEqual(reader.ReadBytes(8), BitConverter.GetBytes(now.ToMillisecondsSinceUnixEpochStart())); // ensure element value is correct Assert.AreEqual(reader.ReadByte(), (byte) 0x00); // ensure last byte is terminator 0x00 Assert.AreEqual(stream.Position, 18); // ensure whole document readed } }
/// <summary> /// Writes a string in JSON format (a la "JSON encode string") - using quotes and escaping charecters that need it /// </summary> /// <param name="wri">TextWriter instance to append data into</param> /// <param name="data">Original string to encode as JSON</param> /// <param name="opt">JSONWriting options instance, if omitted then JSONWritingOptions.Compact is used</param> /// <param name="utcOffset">UTC offset override. If not supplied then offset form local time zone is used</param> public static void EncodeDateTime(TextWriter wri, DateTime data, JSONWritingOptions opt = null, TimeSpan? utcOffset = null) { if (opt==null) opt = JSONWritingOptions.Compact; if (!opt.ISODates) { wri.Write("new Date({0})".Args( data.ToMillisecondsSinceUnixEpochStart() )); return; } wri.Write('"'); var year = data.Year; if (year>999) wri.Write(year); else if (year>99) { wri.Write('0'); wri.Write(year); } else if (year>9) { wri.Write("00"); wri.Write(year); } else if (year>0) { wri.Write("000"); wri.Write(year); } wri.Write('-'); var month = data.Month; if (month>9) wri.Write(month); else { wri.Write('0'); wri.Write(month); } wri.Write('-'); var day = data.Day; if (day>9) wri.Write(day); else { wri.Write('0'); wri.Write(day); } wri.Write('T'); var hour = data.Hour; if (hour>9) wri.Write(hour); else { wri.Write('0'); wri.Write(hour); } wri.Write(':'); var minute = data.Minute; if (minute>9) wri.Write(minute); else { wri.Write('0'); wri.Write(minute); } wri.Write(':'); var second = data.Second; if (second>9) wri.Write(second); else { wri.Write('0'); wri.Write(second); } var ms = data.Millisecond; if (ms>0) { wri.Write('.'); if (ms>99) wri.Write(ms); else if (ms>9) { wri.Write('0'); wri.Write(ms); } else { wri.Write("00"); wri.Write(ms); } } if (data.Kind==DateTimeKind.Utc) wri.Write('Z'); else { //var offset = utcOffset==null ? TimeZoneInfo.Local.BaseUtcOffset : utcOffset.Value; //dlat 2014/06/15 var offset = utcOffset==null ? TimeZoneInfo.Local.GetUtcOffset(data) : utcOffset.Value; wri.Write( offset.Ticks<0 ? '-' : '+' ); hour = Math.Abs(offset.Hours); if (hour>9) wri.Write(hour); else { wri.Write('0'); wri.Write(hour); } wri.Write(':'); minute = Math.Abs(offset.Minutes); if (minute>9) wri.Write(minute); else { wri.Write('0'); wri.Write(minute); } } wri.Write('"'); }