Ejemplo n.º 1
0
        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
              }
        }
Ejemplo n.º 2
0
        /// <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('"');
        }