void GetMonthRangeInUtc(DateTime aDate, out DateTime utcMonthStart, out DateTime utcNextMonthStart)
{
// compute the first day of the month containing aDate and successive months
DateTime[] monthStart = new DateTime[2];
for (int i = 0; i < monthStart.Length; i++)
{
monthStart[i] = new DateTime(aDate.Year, aDate.Month++, 1);
}
// Compute the offset from UTC to our local time (UTC + offset = localtime).
TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(aDate);
// convert local times to UTC (UTC = localtime - offset)
utcMonthStart = monthStart[0].Subtract(utcOffset);
utcNextMonthStart = monthStart[1].Subtract(utcOffset);
}
dm9pZCBHZXRNb250aFJhbmdlSW5VdGMoRGF0ZVRpbWUgYURhdGUsIG91dCBEYXRlVGltZSB1dGNNb250aFN0YXJ0LCBvdXQgRGF0ZVRpbWUgdXRjTmV4dE1vbnRoU3RhcnQpCnsKICAgIC8vIGNvbXB1dGUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGggY29udGFpbmluZyBhRGF0ZSBhbmQgc3VjY2Vzc2l2ZSBtb250aHMgICAKICAgIERhdGVUaW1lW10gbW9udGhTdGFydCA9IG5ldyBEYXRlVGltZVsyXTsgICAgCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vbnRoU3RhcnQuTGVuZ3RoOyBpKyspCiAgICB7CiAgICAgICAgbW9udGhTdGFydFtpXSA9IG5ldyBEYXRlVGltZShhRGF0ZS5ZZWFyLCBhRGF0ZS5Nb250aCsrLCAxKTsKICAgIH0KICAgIAogICAgLy8gQ29tcHV0ZSB0aGUgb2Zmc2V0IGZyb20gVVRDIHRvIG91ciBsb2NhbCB0aW1lIChVVEMgKyBvZmZzZXQgPSBsb2NhbHRpbWUpLgogICAgVGltZVNwYW4gdXRjT2Zmc2V0ID0gVGltZVpvbmUuQ3VycmVudFRpbWVab25lLkdldFV0Y09mZnNldChhRGF0ZSk7CiAgICAKICAgIC8vIGNvbnZlcnQgbG9jYWwgdGltZXMgdG8gVVRDIChVVEMgPSBsb2NhbHRpbWUgLSBvZmZzZXQpCiAgICB1dGNNb250aFN0YXJ0ID0gbW9udGhTdGFydFswXS5TdWJ0cmFjdCh1dGNPZmZzZXQpOwogICAgdXRjTmV4dE1vbnRoU3RhcnQgPSBtb250aFN0YXJ0WzFdLlN1YnRyYWN0KHV0Y09mZnNldCk7ICAgCn0=