+/**\r
+ Change the file time to local time based on the timezone.\r
+\r
+ @param[in] Time The file time.\r
+ @param[in] LocalTimeZone Local time zone.\r
+**/\r
+VOID\r
+FileTimeToLocalTime (\r
+ IN EFI_TIME *Time,\r
+ IN INT16 LocalTimeZone\r
+ )\r
+{\r
+ INTN MinuteDiff;\r
+ INTN TempMinute;\r
+ INTN HourNumberOfTempMinute;\r
+ INTN TempHour;\r
+ INTN DayNumberOfTempHour;\r
+ INTN TempDay;\r
+ INTN MonthNumberOfTempDay;\r
+ INTN TempMonth;\r
+ INTN YearNumberOfTempMonth;\r
+ INTN MonthRecord;\r
+\r
+ ASSERT ((Time->TimeZone >= -1440) && (Time->TimeZone <=1440));\r
+ ASSERT ((LocalTimeZone >= -1440) && (LocalTimeZone <=1440));\r
+ ASSERT ((Time->Month >= 1) && (Time->Month <= 12));\r
+\r
+ if(Time->TimeZone == LocalTimeZone) {\r
+ //\r
+ //if the file timezone is equal to the local timezone, there is no need to adjust the file time.\r
+ //\r
+ return;\r
+ }\r
+\r
+ if((Time->Year % 4 == 0 && Time->Year / 100 != 0)||(Time->Year % 400 == 0)) {\r
+ //\r
+ // Day in February of leap year is 29.\r
+ //\r
+ mDayOfMonth[1] = 29;\r
+ }\r
+\r
+ MinuteDiff = Time->TimeZone - LocalTimeZone;\r
+ TempMinute = Time->Minute + MinuteDiff;\r
+\r
+ //\r
+ // Calculate Time->Minute\r
+ // TempHour will be used to calculate Time->Hour\r
+ //\r
+ HourNumberOfTempMinute = TempMinute / 60;\r
+ if(TempMinute < 0) {\r
+ HourNumberOfTempMinute --; \r
+ }\r
+ TempHour = Time->Hour + HourNumberOfTempMinute;\r
+ Time->Minute = (UINT8)(TempMinute - 60 * HourNumberOfTempMinute);\r
+\r
+ //\r
+ // Calculate Time->Hour\r
+ // TempDay will be used to calculate Time->Day\r
+ //\r
+ DayNumberOfTempHour = TempHour / 24 ;\r
+ if(TempHour < 0){\r
+ DayNumberOfTempHour--;\r
+ }\r
+ TempDay = Time->Day + DayNumberOfTempHour;\r
+ Time->Hour = (UINT8)(TempHour - 24 * DayNumberOfTempHour);\r
+\r
+ //\r
+ // Calculate Time->Day\r
+ // TempMonth will be used to calculate Time->Month\r
+ //\r
+ MonthNumberOfTempDay = (TempDay - 1) / (INTN)mDayOfMonth[Time->Month - 1];\r
+ MonthRecord = (INTN)(Time->Month) ;\r
+ if(TempDay - 1 < 0){\r
+ MonthNumberOfTempDay -- ;\r
+ MonthRecord -- ;\r
+ }\r
+ TempMonth = Time->Month + MonthNumberOfTempDay;\r
+ Time->Day = (UINT8)(TempDay - (INTN)mDayOfMonth[(MonthRecord - 1 + 12) % 12] * MonthNumberOfTempDay);\r
+\r
+ //\r
+ // Calculate Time->Month, Time->Year\r
+ //\r
+ YearNumberOfTempMonth = (TempMonth - 1) / 12;\r
+ if(TempMonth - 1 < 0){\r
+ YearNumberOfTempMonth --;\r
+ }\r
+ Time->Month = (UINT8)(TempMonth - 12 * (YearNumberOfTempMonth));\r
+ Time->Year = (UINT16)(Time->Year + YearNumberOfTempMonth);\r
+}\r
+\r