0

我正在使用 DateTime.Parse("01/18/2013") 来获取 DateTime 对象,然后使用下面的方法(传递所有参数)来获取以毫秒为单位的 Unix 时间戳。

long GetDateTimeMS(int yr, int month, int day, int hr, int min)

    {
        Calendar c = Calendar.GetInstance(Java.Util.TimeZone.Default);
        c.Set(Java.Util.CalendarField.DayOfMonth, day);
        c.Set(CalendarField.HourOfDay, hr);
        c.Set(CalendarField.Minute, min);
        c.Set(CalendarField.Month, month);
        c.Set(CalendarField.Year, yr);
                    return c.TimeInMillis;

    }

现在,当我使用以下代码在 Android 中创建日历事件时

           //default timezone
            Java.Util.TimeZone zone = Java.Util.TimeZone.Default;
            var meetingDate = AndroidController.PoppedList[_estimateId].MeetingDate;
            ContentValues values = new ContentValues();


     values.Put(CalendarContract.Events.InterfaceConsts.Dtstart,
                 GetDateTimeMS(meetingDate.Year, meetingDate.Month, 
                                meetingDate.Day, 
                                  meetingDate.Hour, 
                                      meetingDate.Minute));

            meetingDate.AddHours(1);
            values.Put(CalendarContract.Events.InterfaceConsts.Dtend,
                    GetDateTimeMS(meetingDate.Year,
                                meetingDate.Month, 
                                 meetingDate.Day, 
                                 meetingDate.Hour,
                                  meetingDate.Minute));

            values.Put(CalendarContract.Events.InterfaceConsts.Title, initTitle);

             values.Put(CalendarContract.Events.InterfaceConsts.CalendarId,_mSelectedCalendarId);

                values.Put(CalendarContract.Events.InterfaceConsts.EventTimezone, zone.DisplayName);



                Android.Net.Uri uri = _parentActivity.ContentResolver.Insert(CalendarContract.Events.ContentUri, values);

该事件被添加到日历中,但日期错误。日期在日历中提前一个月。我解析的日期是 2013 年 1 月 18 日星期五,但日历事件是为 2013 年 2 月 18 日星期一创建的。这与我的时区有关吗?(我已经在 java.util.timezone.default 中使用了默认时区)。

任何帮助将不胜感激。

谢谢!

4

2 回答 2

3

日历月份的一个常见问题是一月是 0 而不是 1。

顺便说一句,如果您不设置毫秒,它将是当前的毫秒。您可能希望将其设置为零以避免混淆。

于 2013-06-08T07:28:00.557 回答
2

这几乎可以肯定是最直接的问题:

c.Set(CalendarField.Month, month);

我的猜测是,您在这里期望 1 表示一月 - 但java.util.Calendar使用基于 0 的月份。你可能想要:

c.Set(CalendarField.Month, month - 1);

也可能存在时区问题,但首先要关注大问题 - 整整一个月的时间几乎永远不会成为时区问题。

或者,要获得自 unix 纪元以来的毫秒数,您可以坚持使用 .NET 类型 - 甚至使用我的Noda Time库。仅使用DateTime

private static readonly DateTime UnixEpoch =
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

static long GetMillisecondsSinceUnixEpoch(int year, int month, int day,
                                          int hour, int minute)
{
    DateTime local = new DateTime(year, month, day, hour, minute, 0,
                                  DateTimeKind.Local);
    DateTime utc = local.ToUniversalTime();
    return (long) (utc - UnixEpoch).TotalMilliseconds;
}

当然,如果您已经在使用DateTime.Parse,则不需要DateTime像这样构造一个新的 - 您可以使用以下结果DateTime.Parse

DateTime local = DateTime.Parse(..., DateTimeStyles.AssumeLocal, ...);
DateTime utc = local.ToUniversalTime();
long millis = (long) (utc - UnixEpoch).TotalMilliseconds;
于 2013-06-08T07:26:07.393 回答