/// <summary> /// Sets zero based calendar hour. /// </summary> internal static void SetZeroBasedHour(this Windows.Globalization.Calendar calendar, int hour) { if (calendar.GetClock() == ClockIdentifiers.TwentyFourHour) { if (hour < 0 || hour > 23) { throw new ArgumentException("Hour should be between 0 and 23."); } calendar.AddHours(hour - calendar.Hour); } else { if (hour < 0 || hour > 11) { throw new ArgumentException("Hour should be between 0 and 11."); } var calendarHour = calendar.Hour == 12 ? 0 : calendar.Hour; calendar.AddHours(hour - calendarHour); } }
private void ShowResults_Click(object sender, RoutedEventArgs e) { // This scenario uses the Windows.Globalization.Calendar class to enumerate through a calendar and // perform calendar math StringBuilder results = new StringBuilder(); results.AppendLine("The number of years in each era of the Japanese era calendar is not regular. " + "It is determined by the length of the given imperial era:"); results.AppendLine(); // Create Japanese calendar. Calendar calendar = new Calendar(new[] { "en-US" }, CalendarIdentifiers.Japanese, ClockIdentifiers.TwentyFourHour); // Enumerate all supported years in all supported Japanese eras. for (calendar.Era = calendar.FirstEra; true; calendar.AddYears(1)) { // Process current era. results.AppendLine("Era " + calendar.EraAsString() + " contains " + calendar.NumberOfYearsInThisEra + " year(s)"); // Enumerate all years in this era. for (calendar.Year = calendar.FirstYearInThisEra; true; calendar.AddYears(1)) { // Begin sample processing of current year. // Move to first day of year. Change of month can affect day so order of assignments is important. calendar.Month = calendar.FirstMonthInThisYear; calendar.Day = calendar.FirstDayInThisMonth; // Set time to midnight (local). calendar.Period = calendar.FirstPeriodInThisDay; // All days have 1 or 2 periods depending on clock type calendar.Hour = calendar.FirstHourInThisPeriod; // Hours start from 12 or 0 depending on clock type calendar.Minute = 0; calendar.Second = 0; calendar.Nanosecond = 0; if (calendar.Year % 1000 == 0) { results.AppendLine(); } else if (calendar.Year % 10 == 0) { results.Append("."); } // End sample processing of current year. // Break after processing last year. if (calendar.Year == calendar.LastYearInThisEra) { break; } } results.AppendLine(); // Break after processing last era. if (calendar.Era == calendar.LastEra) { break; } } results.AppendLine(); // This section shows enumeration through the hours in a day to demonstrate that the number of time units in a given period (hours in a day, minutes in an hour, etc.) // should not be regarded as fixed. With Daylight Saving Time and other local calendar adjustments, a given day may have not have 24 hours, and // a given hour may not have 60 minutes, etc. results.AppendLine("The number of hours in a day is not constant. " + "The US calendar transitions from daylight saving time to standard time on 4 November 2012:\n"); // Create a DateTimeFormatter to display dates DateTimeFormatter displayDate = new DateTimeFormatter("longdate"); // Create a gregorian calendar for the US with 12-hour clock format Calendar currentCal = new Windows.Globalization.Calendar(new string[] { "en-US" }, CalendarIdentifiers.Gregorian, ClockIdentifiers.TwentyFourHour, "America/Los_Angeles"); // Set the calendar to a the date of the Daylight Saving Time-to-Standard Time transition for the US in 2012. // DST ends in the America/Los_Angeles time zone at 4 November 2012 02:00 PDT = 4 November 2012 09:00 UTC. DateTime dstDate = new DateTime(2012, 11, 4, 9, 0, 0, DateTimeKind.Utc); currentCal.SetDateTime(dstDate); // Set the current calendar to one day before DST change. Create a second calendar for comparision and set it to one day after DST change. Calendar endDate = currentCal.Clone(); currentCal.AddDays(-1); endDate.AddDays(1); // Enumerate the day before, the day of, and the day after the 2012 DST-to-Standard time transition while (currentCal.Day <= endDate.Day) { // Process current day. DateTimeOffset date = currentCal.GetDateTime(); results.AppendFormat("{0} contains {1} hour(s)\n", displayDate.Format(date), currentCal.NumberOfHoursInThisPeriod); // Enumerate all hours in this day. // Create a calendar to represent the following day. Calendar nextDay = currentCal.Clone(); nextDay.AddDays(1); for (currentCal.Hour = currentCal.FirstHourInThisPeriod; true; currentCal.AddHours(1)) { // Display the hour for each hour in the day. results.AppendFormat("{0} ", currentCal.HourAsPaddedString(2)); // Break upon reaching the next period (i.e. the first period in the following day). if (currentCal.Day == nextDay.Day && currentCal.Period == nextDay.Period) { break; } } results.AppendLine(); } // Display results OutputTextBlock.Text = results.ToString(); }
/// <summary> /// This is the click handler for the 'Default' button. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Display_Click(object sender, RoutedEventArgs e) { // This scenario uses the Windows.Globalization.Calendar class to enumerate through a calendar and // perform calendar math StringBuilder results = new StringBuilder(); results.AppendLine("The number of years in each era of the Japanese era calendar is not regular. It is determined by the length of the given imperial era:\n"); // Create Japanese calendar. Calendar calendar = new Calendar(new[] { "en-US" }, CalendarIdentifiers.Japanese, ClockIdentifiers.TwentyFourHour); // Enumerate all supported years in all supported Japanese eras. for (calendar.Era = calendar.FirstEra; true; calendar.AddYears(1)) { // Process current era. results.AppendLine("Era " + calendar.EraAsString() + " contains " + calendar.NumberOfYearsInThisEra + " year(s)"); // Enumerate all years in this era. for (calendar.Year = calendar.FirstYearInThisEra; true; calendar.AddYears(1)) { // Begin sample processing of current year. // Move to first day of year. Change of month can affect day so order of assignments is important. calendar.Month = calendar.FirstMonthInThisYear; calendar.Day = calendar.FirstDayInThisMonth; // Set time to midnight (local). calendar.Period = calendar.FirstPeriodInThisDay; // All days have 1 or 2 periods depending on clock type calendar.Hour = calendar.FirstHourInThisPeriod; // Hours start from 12 or 0 depending on clock type calendar.Minute = 0; calendar.Second = 0; calendar.Nanosecond = 0; if (calendar.Year % 1000 == 0) { results.AppendLine(); } else if (calendar.Year % 10 == 0) { results.Append("."); } // End sample processing of current year. // Break after processing last year. if (calendar.Year == calendar.LastYearInThisEra) { break; } } results.AppendLine(); // Break after processing last era. if (calendar.Era == calendar.LastEra) { break; } } // This section shows enumeration through the hours in a day to demonstrate that the number of time units in a given period (hours in a day, minutes in an hour, etc.) // should not be regarded as fixed. With Daylight Saving Time and other local calendar adjustments, a given day may have not have 24 hours, and // a given hour may not have 60 minutes, etc. results.AppendLine("\nThe number of hours in a day is not invariable. The US calendar transitions from DST to standard time on 4 November 2012:\n"); // Create a DateTimeFormatter to display dates DateTimeFormatter displayDate = new Windows.Globalization.DateTimeFormatting.DateTimeFormatter("longdate"); // Create a gregorian calendar for the US with 12-hour clock format Calendar currentCal = new Windows.Globalization.Calendar(new string[] { "en-US" }, CalendarIdentifiers.Gregorian, ClockIdentifiers.TwentyFourHour, "america/los_angeles"); // Set the calendar to a the date of the Daylight Saving Time-to-Standard Time transition for the US in 2012. // DST ends in the US at 02:00 on 4 November 2012 DateTime dstDate = new DateTime(2012, 11, 4); currentCal.SetDateTime(dstDate); // Set the current calendar to one day before DST change. Create a second calendar for comparision and set it to one day after DST change. Calendar endDate = currentCal.Clone(); currentCal.AddDays(-1); endDate.AddDays(1); // Enumerate the day before, the day of, and the day after the 2012 DST-to-Standard time transition while (currentCal.Day <= endDate.Day) { // Process current day. DateTimeOffset date = currentCal.GetDateTime(); results.AppendFormat("{0} contains {1} hour(s)\n", displayDate.Format(date), currentCal.NumberOfHoursInThisPeriod); // Enumerate all hours in this day. // Create a calendar to represent the following day. Calendar nextDay = currentCal.Clone(); nextDay.AddDays(1); for (currentCal.Hour = currentCal.FirstHourInThisPeriod; true; currentCal.AddHours(1)) { // Display the hour for each hour in the day. results.AppendFormat("{0} ", currentCal.HourAsPaddedString(2)); // Break upon reaching the next period (i.e. the first period in the following day). if (currentCal.Day == nextDay.Day && currentCal.Period == nextDay.Period) { break; } } results.AppendLine(); } // Display results OutputTextBlock.Text = results.ToString(); }
/// <summary> /// Invoked when 'Get History' button is clicked. /// Depending on the user selection, this handler uses one of the overloaded /// 'GetSystemHistoryAsync' APIs to retrieve the pedometer history of the user /// </summary> /// <param name="sender">unused</param> /// <param name="e">unused</param> async private void GetHistory_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) { IReadOnlyList<PedometerReading> historyReadings = null; DateTimeFormatter timestampFormatter = new DateTimeFormatter("shortdate longtime"); // Disable subsequent history retrieval while the async operation is in progress GetHistory.IsEnabled = false; // clear previous content being displayed historyRecords.Clear(); try { if (getAllHistory) { DateTime dt = DateTime.FromFileTimeUtc(0); DateTimeOffset fromBeginning = new DateTimeOffset(dt); rootPage.NotifyUser("Retrieving all available History", NotifyType.StatusMessage); historyReadings = await Pedometer.GetSystemHistoryAsync(fromBeginning); } else { String notificationString = "Retrieving history from: "; Calendar calendar = new Calendar(); calendar.ChangeClock("24HourClock"); // DateTime picker will also include hour, minute and seconds from the the system time. // Decrement the same to be able to correctly add TimePicker values. calendar.SetDateTime(FromDate.Date); calendar.AddNanoseconds(-calendar.Nanosecond); calendar.AddSeconds(-calendar.Second); calendar.AddMinutes(-calendar.Minute); calendar.AddHours(-calendar.Hour); calendar.AddSeconds(Convert.ToInt32(FromTime.Time.TotalSeconds)); DateTimeOffset fromTime = calendar.GetDateTime(); calendar.SetDateTime(ToDate.Date); calendar.AddNanoseconds(-calendar.Nanosecond); calendar.AddSeconds(-calendar.Second); calendar.AddMinutes(-calendar.Minute); calendar.AddHours(-calendar.Hour); calendar.AddSeconds(Convert.ToInt32(ToTime.Time.TotalSeconds)); DateTimeOffset toTime = calendar.GetDateTime(); notificationString += timestampFormatter.Format(fromTime); notificationString += " To "; notificationString += timestampFormatter.Format(toTime); if (toTime.ToFileTime() < fromTime.ToFileTime()) { rootPage.NotifyUser("Invalid time span. 'To Time' must be equal or more than 'From Time'", NotifyType.ErrorMessage); // Enable subsequent history retrieval while the async operation is in progress GetHistory.IsEnabled = true; } else { TimeSpan span; span = TimeSpan.FromTicks(toTime.Ticks - fromTime.Ticks); rootPage.NotifyUser(notificationString, NotifyType.StatusMessage); historyReadings = await Pedometer.GetSystemHistoryAsync(fromTime, span); } } if (historyReadings != null) { foreach(PedometerReading reading in historyReadings) { HistoryRecord record = new HistoryRecord(reading); historyRecords.Add(record); } rootPage.NotifyUser("History retrieval completed", NotifyType.StatusMessage); } } catch (UnauthorizedAccessException) { rootPage.NotifyUser("User has denied access to activity history", NotifyType.ErrorMessage); } // Finally, re-enable history retrieval GetHistory.IsEnabled = true; }
/// <summary> /// Invoked when 'Get History' button is clicked. /// Depending on the user selection, this handler uses one of the overloaded /// 'GetSystemHistoryAsync' APIs to retrieve the pedometer history of the user /// </summary> /// <param name="sender">unused</param> /// <param name="e">unused</param> async private void GetHistory_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) { GetHistory.IsEnabled = false; // Determine if we can access pedometers var deviceAccessInfo = DeviceAccessInformation.CreateFromDeviceClassId(PedometerClassId); if (deviceAccessInfo.CurrentStatus == DeviceAccessStatus.Allowed) { // Determine if a pedometer is present // This can also be done using Windows::Devices::Enumeration::DeviceInformation::FindAllAsync var sensor = await Pedometer.GetDefaultAsync(); if (sensor != null) { IReadOnlyList<PedometerReading> historyReadings = null; var timestampFormatter = new DateTimeFormatter("shortdate longtime"); // Disable subsequent history retrieval while the async operation is in progress GetHistory.IsEnabled = false; // clear previous content being displayed historyRecords.Clear(); try { if (getAllHistory) { var dt = DateTime.FromFileTimeUtc(0); var fromBeginning = new DateTimeOffset(dt); rootPage.NotifyUser("Retrieving all available History", NotifyType.StatusMessage); historyReadings = await Pedometer.GetSystemHistoryAsync(fromBeginning); } else { String notificationString = "Retrieving history from: "; var calendar = new Calendar(); calendar.ChangeClock("24HourClock"); // DateTime picker will also include hour, minute and seconds from the the system time. // Decrement the same to be able to correctly add TimePicker values. calendar.SetDateTime(FromDate.Date); calendar.AddNanoseconds(-calendar.Nanosecond); calendar.AddSeconds(-calendar.Second); calendar.AddMinutes(-calendar.Minute); calendar.AddHours(-calendar.Hour); calendar.AddSeconds(Convert.ToInt32(FromTime.Time.TotalSeconds)); DateTimeOffset fromTime = calendar.GetDateTime(); calendar.SetDateTime(ToDate.Date); calendar.AddNanoseconds(-calendar.Nanosecond); calendar.AddSeconds(-calendar.Second); calendar.AddMinutes(-calendar.Minute); calendar.AddHours(-calendar.Hour); calendar.AddSeconds(Convert.ToInt32(ToTime.Time.TotalSeconds)); DateTimeOffset toTime = calendar.GetDateTime(); notificationString += timestampFormatter.Format(fromTime); notificationString += " To "; notificationString += timestampFormatter.Format(toTime); if (toTime.ToFileTime() < fromTime.ToFileTime()) { rootPage.NotifyUser("Invalid time span. 'To Time' must be equal or more than 'From Time'", NotifyType.ErrorMessage); // Enable subsequent history retrieval while the async operation is in progress GetHistory.IsEnabled = true; } else { TimeSpan span = TimeSpan.FromTicks(toTime.Ticks - fromTime.Ticks); rootPage.NotifyUser(notificationString, NotifyType.StatusMessage); historyReadings = await Pedometer.GetSystemHistoryAsync(fromTime, span); } } if (historyReadings != null) { foreach (PedometerReading reading in historyReadings) { HistoryRecord record = new HistoryRecord(reading); historyRecords.Add(record); // Get at most 100 records (number is arbitrary chosen for demonstration purposes) if (historyRecords.Count == 100) { break; } } rootPage.NotifyUser("History retrieval completed", NotifyType.StatusMessage); } } catch (UnauthorizedAccessException) { rootPage.NotifyUser("User has denied access to activity history", NotifyType.ErrorMessage); } // Finally, re-enable history retrieval GetHistory.IsEnabled = true; } else { rootPage.NotifyUser("No pedometers found", NotifyType.ErrorMessage); } } else { rootPage.NotifyUser("Access to pedometers is denied", NotifyType.ErrorMessage); } }