IOS and "shifted appointments" or How Exchange stores appointment start and end time.

An example of wrong meeting created by
iPhone and iPAD with IOS 5.01 and 5.1 in Moscow (+04:00 UTC without DTS) TZ

 Meeting beginning:

Meeting end:

 

Everything fine.

 Here how TZ stamp in “user friendly”
format, which showed in client:

 

also seems good

 Here is TZ description:

Full text:

Time Zone Definition:

bMajorVersion = 0x02 (2)

bMinorVersion = 0x01 (1)

cbHeader = 0x0020 (32)

wReserved = 0x0002 (2)

cchKeyName = 0x000D (13)

szKeyName = Europe/Moscow

cRules = 0x0001 (1)

 

TZRule[0x0].bMajorVersion = 0x02 (2)

TZRule[0x0].bMinorVersion = 0x01 (1)

TZRule[0x0].wReserved = 0x003E (62)

TZRule[0x0].wTZRuleFlags = 0x0002 =
TZRULE_FLAG_EFFECTIVE_TZREG

TZRule[0x0].wYear = 0x0001 (1)

TZRule[0x0].X = cb: 14 lpb:
0100000001000000000000000000

TZRule[0x0].lBias = 0xFFFFFF4C (-180)

TZRule[0x0].lStandardBias = 0x00000000 (0)

TZRule[0x0].lDaylightBias = 0x00000000 (0)

 

TZRule[0x0].stStandardDate.wYear = 0x0 (0)

TZRule[0x0].stStandardDate.wMonth = 0x0 (0)

TZRule[0x0].stStandardDate.wDayOfWeek = 0x0
(0)

TZRule[0x0].stStandardDate.wDay = 0x0 (0)

TZRule[0x0].stStandardDate.wHour = 0x0 (0)

TZRule[0x0].stStandardDate.wMinute = 0x0
(0)

TZRule[0x0].stStandardDate.wSecond = 0x0
(0)

TZRule[0x0].stStandardDate.wMilliseconds =
0x0 (0)

 

TZRule[0x0].stDaylightDate.wYear = 0x0 (0)

TZRule[0x0].stDaylightDate.wMonth = 0x0 (0)

TZRule[0x0].stDaylightDate.wDayOfWeek = 0x0
(0)

TZRule[0x0].stDaylightDate.wDay = 0x0 (0)

TZRule[0x0].stDaylightDate.wHour = 0x0 (0)

TZRule[0x0].stDaylightDate.wMinute = 0x0
(0)

TZRule[0x0].stDaylightDate.wSecond = 0x0
(0)

TZRule[0x0].stDaylightDate.wMilliseconds =
0x0 (0)

 

Attribute description can be founded here:
https://msdn.microsoft.com/en-us/library/ee160657(v=exchg.80).aspx

This case related with:

lBias
(4 bytes):
This field specifies the time zone's
offset in minutes from UTC.

iPhone stamp it as -180 from UTC (+03:00
UTC), instead of (+04:00 UTC)

 

Here is same attribute from meeting created
in Outlook 2010:

 Time Zone Definition:

bMajorVersion = 0x02 (2)

bMinorVersion = 0x01 (1)

cbHeader = 0x0030 (48)

wReserved = 0x0002 (2)

cchKeyName = 0x0015 (21)

szKeyName = Russian Standard Time

cRules = 0x0002 (2)

 

It for 2010 year, where we still have DTS in Russia:

TZRule[0x0].bMajorVersion = 0x02 (2)

TZRule[0x0].bMinorVersion = 0x01 (1)

TZRule[0x0].wReserved = 0x003E (62)

TZRule[0x0].wTZRuleFlags = 0x0000 = 0x0

TZRule[0x0].wYear = 0x07DA (2010)

TZRule[0x0].X = cb: 14 lpb:
0100000001000000000000000000

TZRule[0x0].lBias = 0xFFFFFF4C (-180)

TZRule[0x0].lStandardBias = 0x00000000 (0)

TZRule[0x0].lDaylightBias = 0xFFFFFFC4
(-60)

 

Here we describe when we move arrows on our clocks:

TZRule[0x0].stStandardDate.wYear = 0x0 (0)

TZRule[0x0].stStandardDate.wMonth = 0xA
(10)

TZRule[0x0].stStandardDate.wDayOfWeek = 0x0
(0)

TZRule[0x0].stStandardDate.wDay = 0x5 (5)

TZRule[0x0].stStandardDate.wHour = 0x3 (3)

TZRule[0x0].stStandardDate.wMinute = 0x0
(0)

TZRule[0x0].stStandardDate.wSecond = 0x0
(0)

TZRule[0x0].stStandardDate.wMilliseconds =
0x0 (0)

 

TZRule[0x0].stDaylightDate.wYear = 0x0 (0)

TZRule[0x0].stDaylightDate.wMonth = 0x3 (3)

TZRule[0x0].stDaylightDate.wDayOfWeek = 0x0
(0)

TZRule[0x0].stDaylightDate.wDay = 0x5 (5)

TZRule[0x0].stDaylightDate.wHour = 0x2 (2)

TZRule[0x0].stDaylightDate.wMinute = 0x0
(0)

TZRule[0x0].stDaylightDate.wSecond = 0x0
(0)

TZRule[0x0].stDaylightDate.wMilliseconds =
0x0 (0)

 

 

Definition for year 2011 (not perfect, because we refused DST only in
summer so first month must have it? But
for 2012 it is OKey):

TZRule[0x1].bMajorVersion = 0x02 (2)

TZRule[0x1].bMinorVersion = 0x01 (1)

TZRule[0x1].wReserved = 0x003E (62)

TZRule[0x1].wTZRuleFlags = 0x0002 =
TZRULE_FLAG_EFFECTIVE_TZREG

TZRule[0x1].wYear = 0x07DB (2011)

TZRule[0x1].X = cb: 14 lpb:
0100000001000000000000000000

TZRule[0x1].lBias = 0xFFFFFF10 (-240)

TZRule[0x1].lStandardBias = 0x00000000 (0)

TZRule[0x1].lDaylightBias = 0xFFFFFFC4
(-60)

 

TZRule[0x1].stStandardDate.wYear = 0x0 (0)

TZRule[0x1].stStandardDate.wMonth = 0x0 (0)

TZRule[0x1].stStandardDate.wDayOfWeek = 0x0
(0)

TZRule[0x1].stStandardDate.wDay = 0x0 (0)

TZRule[0x1].stStandardDate.wHour = 0x0 (0)

TZRule[0x1].stStandardDate.wMinute = 0x0
(0)

TZRule[0x1].stStandardDate.wSecond = 0x0
(0)

TZRule[0x1].stStandardDate.wMilliseconds =
0x0 (0)

 

TZRule[0x1].stDaylightDate.wYear = 0x0 (0)

TZRule[0x1].stDaylightDate.wMonth = 0x0 (0)

TZRule[0x1].stDaylightDate.wDayOfWeek = 0x0
(0)

TZRule[0x1].stDaylightDate.wDay = 0x0 (0)

TZRule[0x1].stDaylightDate.wHour = 0x0 (0)

TZRule[0x1].stDaylightDate.wMinute = 0x0
(0)

TZRule[0x1].stDaylightDate.wSecond = 0x0
(0)

TZRule[0x1].stDaylightDate.wMilliseconds =
0x0 (0)

 

So we can see -240 minutes from UTC instead of -180 in previous one.

  

Resolution:

1 Involve vendor to resolve this issue

2 Use Abu-Dhabi TZ, which is +04:00 for
years w/o DTS

Comments