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);

イベントはカレンダーに追加されますが、日付が間違っています。日付はカレンダーで 1 か月進みます。解析した日付は 2013 年 1 月 18 日金曜日ですが、カレンダー イベントは 2013 年 2 月 18 日月曜日に作成されます。これは私のタイムゾーンに関係していますか? (私はすでに java.util.timezone.default でデフォルトのタイムゾーンを使用しています)。

どんな助けでも大歓迎です。

ありがとう!

4

2 に答える 2

3

暦月のよくある落とし穴は、1 月が 1 ではなく 0 であることです。

ところで、ミリ秒を設定しない場合、現在のミリ秒が何であれなります。混乱を避けるために、ゼロに設定することをお勧めします。

于 2013-06-08T07:28:00.557 に答える
2

これはほぼ確実に最も差し迫った問題です。

c.Set(CalendarField.Month, month);

私の推測では、ここでは 1 が 1 月を意味すると予想していますが、java.util.Calendar0 から始まる月を使用しています。あなたはおそらく欲しい:

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

タイム ゾーンの問題もあるかもしれませんが、最初に大きな問題に集中してください。丸 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 に答える