Xamarin Public Jenkins dd547c45d4 Imported Upstream version 4.2.1.36
Former-commit-id: fb75898888a02f4d3a74cf0a5b841681bc4c7fa8
2015-11-10 15:04:22 +00:00

340 lines
9.9 KiB
C#

/*
Copyright (C) 2007-2013 Jeroen Frijters
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Jeroen Frijters
jeroen@frijters.net
*/
using System;
static class Java_java_util_TimeZone
{
private static string GetCurrentTimeZoneID()
{
#if NET_4_0
return TimeZoneInfo.Local.Id;
#else
// we don't want a static dependency on System.Core (to be able to run on .NET 2.0)
Type typeofTimeZoneInfo = Type.GetType("System.TimeZoneInfo, System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
if (typeofTimeZoneInfo != null)
{
try
{
return (string)typeofTimeZoneInfo.GetProperty("Id").GetValue(typeofTimeZoneInfo.GetProperty("Local").GetValue(null, null), null);
}
catch (Exception x)
{
// older Mono versions did not wrap the exception in a TargetInvocationExcception,
// so we check both x and x.InnerException
if (typeofTimeZoneInfo.Assembly.GetType("System.TimeZoneNotFoundException").IsInstanceOfType(x)
|| typeofTimeZoneInfo.Assembly.GetType("System.TimeZoneNotFoundException").IsInstanceOfType(x.InnerException))
{
// MONOBUG Mono's TimeZoneInfo.Local property throws a TimeZoneNotFoundException on Windows
// (https://bugzilla.novell.com/show_bug.cgi?id=622524)
return TimeZone.CurrentTimeZone.StandardName;
}
else
{
throw;
}
}
}
else
{
// HACK this is very lame and probably won't work on localized windows versions
return TimeZone.CurrentTimeZone.StandardName;
}
#endif
}
public static string getSystemTimeZoneID(string javaHome)
{
// (the switch was generated from the contents of $JAVA_HOME/lib/tzmappings)
switch (GetCurrentTimeZoneID())
{
case "Romance":
case "Romance Standard Time":
return "Europe/Paris";
case "Warsaw":
return "Europe/Warsaw";
case "Central Europe":
case "Central Europe Standard Time":
case "Prague Bratislava":
return "Europe/Prague";
case "W. Central Africa Standard Time":
return "Africa/Luanda";
case "FLE":
case "FLE Standard Time":
return "Europe/Helsinki";
case "GFT":
case "GFT Standard Time":
case "GTB":
case "GTB Standard Time":
return "Europe/Athens";
case "Israel":
case "Israel Standard Time":
return "Asia/Jerusalem";
case "Arab":
case "Arab Standard Time":
return "Asia/Riyadh";
case "Arabic Standard Time":
return "Asia/Baghdad";
case "E. Africa":
case "E. Africa Standard Time":
return "Africa/Nairobi";
case "Saudi Arabia":
case "Saudi Arabia Standard Time":
return "Asia/Riyadh";
case "Iran":
case "Iran Standard Time":
return "Asia/Tehran";
case "Afghanistan":
case "Afghanistan Standard Time":
return "Asia/Kabul";
case "India":
case "India Standard Time":
return "Asia/Calcutta";
case "Myanmar Standard Time":
return "Asia/Rangoon";
case "Nepal Standard Time":
return "Asia/Katmandu";
case "Sri Lanka":
case "Sri Lanka Standard Time":
return "Asia/Colombo";
case "Beijing":
case "China":
case "China Standard Time":
return "Asia/Shanghai";
case "AUS Central":
case "AUS Central Standard Time":
return "Australia/Darwin";
case "Cen. Australia":
case "Cen. Australia Standard Time":
return "Australia/Adelaide";
case "Vladivostok":
case "Vladivostok Standard Time":
return "Asia/Vladivostok";
case "West Pacific":
case "West Pacific Standard Time":
return "Pacific/Guam";
case "E. South America":
case "E. South America Standard Time":
return "America/Sao_Paulo";
case "Greenland Standard Time":
return "America/Godthab";
case "Newfoundland":
case "Newfoundland Standard Time":
return "America/St_Johns";
case "Pacific SA":
case "Pacific SA Standard Time":
return "America/Santiago";
case "SA Western":
case "SA Western Standard Time":
return "America/Caracas";
case "SA Pacific":
case "SA Pacific Standard Time":
return "America/Bogota";
case "US Eastern":
case "US Eastern Standard Time":
return "America/Indianapolis";
case "Central America Standard Time":
return "America/Regina";
case "Mexico":
case "Mexico Standard Time":
return "America/Mexico_City";
case "Canada Central":
case "Canada Central Standard Time":
return "America/Regina";
case "US Mountain":
case "US Mountain Standard Time":
return "America/Phoenix";
case "GMT":
case "GMT Standard Time":
return "Europe/London";
case "Ekaterinburg":
case "Ekaterinburg Standard Time":
return "Asia/Yekaterinburg";
case "West Asia":
case "West Asia Standard Time":
return "Asia/Karachi";
case "Central Asia":
case "Central Asia Standard Time":
return "Asia/Dhaka";
case "N. Central Asia Standard Time":
return "Asia/Novosibirsk";
case "Bangkok":
case "Bangkok Standard Time":
return "Asia/Bangkok";
case "North Asia Standard Time":
return "Asia/Krasnoyarsk";
case "SE Asia":
case "SE Asia Standard Time":
return "Asia/Bangkok";
case "North Asia East Standard Time":
return "Asia/Ulaanbaatar";
case "Singapore":
case "Singapore Standard Time":
return "Asia/Singapore";
case "Taipei":
case "Taipei Standard Time":
return "Asia/Taipei";
case "W. Australia":
case "W. Australia Standard Time":
return "Australia/Perth";
case "Korea":
case "Korea Standard Time":
return "Asia/Seoul";
case "Tokyo":
case "Tokyo Standard Time":
return "Asia/Tokyo";
case "Yakutsk":
case "Yakutsk Standard Time":
return "Asia/Yakutsk";
case "Central European":
case "Central European Standard Time":
return "Europe/Belgrade";
case "W. Europe":
case "W. Europe Standard Time":
return "Europe/Berlin";
case "Tasmania":
case "Tasmania Standard Time":
return "Australia/Hobart";
case "AUS Eastern":
case "AUS Eastern Standard Time":
return "Australia/Sydney";
case "E. Australia":
case "E. Australia Standard Time":
return "Australia/Brisbane";
case "Sydney Standard Time":
return "Australia/Sydney";
case "Central Pacific":
case "Central Pacific Standard Time":
return "Pacific/Guadalcanal";
case "Dateline":
case "Dateline Standard Time":
return "GMT-1200";
case "Fiji":
case "Fiji Standard Time":
return "Pacific/Fiji";
case "Samoa":
case "Samoa Standard Time":
return "Pacific/Apia";
case "Hawaiian":
case "Hawaiian Standard Time":
return "Pacific/Honolulu";
case "Alaskan":
case "Alaskan Standard Time":
return "America/Anchorage";
case "Pacific":
case "Pacific Standard Time":
return "America/Los_Angeles";
case "Mexico Standard Time 2":
return "America/Chihuahua";
case "Mountain":
case "Mountain Standard Time":
return "America/Denver";
case "Central":
case "Central Standard Time":
return "America/Chicago";
case "Eastern":
case "Eastern Standard Time":
return "America/New_York";
case "E. Europe":
case "E. Europe Standard Time":
return "Europe/Minsk";
case "Egypt":
case "Egypt Standard Time":
return "Africa/Cairo";
case "South Africa":
case "South Africa Standard Time":
return "Africa/Harare";
case "Atlantic":
case "Atlantic Standard Time":
return "America/Halifax";
case "SA Eastern":
case "SA Eastern Standard Time":
return "America/Buenos_Aires";
case "Mid-Atlantic":
case "Mid-Atlantic Standard Time":
return "Atlantic/South_Georgia";
case "Azores":
case "Azores Standard Time":
return "Atlantic/Azores";
case "Cape Verde Standard Time":
return "Atlantic/Cape_Verde";
case "Russian":
case "Russian Standard Time":
return "Europe/Moscow";
case "New Zealand":
case "New Zealand Standard Time":
return "Pacific/Auckland";
case "Tonga Standard Time":
return "Pacific/Tongatapu";
case "Arabian":
case "Arabian Standard Time":
return "Asia/Muscat";
case "Caucasus":
case "Caucasus Standard Time":
return "Asia/Yerevan";
case "Greenwich":
case "Greenwich Standard Time":
return "GMT";
case "Central Brazilian Standard Time":
return "America/Manaus";
case "Central Standard Time (Mexico)":
return "America/Mexico_City";
case "Georgian Standard Time":
return "Asia/Tbilisi";
case "Mountain Standard Time (Mexico)":
return "America/Chihuahua";
case "Namibia Standard Time":
return "Africa/Windhoek";
case "Pacific Standard Time (Mexico)":
return "America/Tijuana";
case "Western Brazilian Standard Time":
return "America/Rio_Branco";
case "Azerbaijan Standard Time":
return "Asia/Baku";
case "Jordan Standard Time":
return "Asia/Amman";
case "Middle East Standard Time":
return "Asia/Beirut";
default:
// this means fall back to GMT offset
return getSystemGMTOffsetID();
}
}
public static string getSystemGMTOffsetID()
{
TimeSpan sp = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now);
int hours = sp.Hours;
int mins = sp.Minutes;
if (hours >= 0 && mins >= 0)
{
return String.Format("GMT+{0:D2}:{1:D2}", hours, mins);
}
else
{
return String.Format("GMT-{0:D2}:{1:D2}", -hours, -mins);
}
}
}