주어진 : LDAP 사용자의 위치를 저장합니다.위치 기반 시간대 검색
위치를 사용하여 시간대를 어떻게 조정합니까? 자바 언어가 선호되는 모든 포인터가 허용됩니다.
미리 감사드립니다.
주어진 : LDAP 사용자의 위치를 저장합니다.위치 기반 시간대 검색
위치를 사용하여 시간대를 어떻게 조정합니까? 자바 언어가 선호되는 모든 포인터가 허용됩니다.
미리 감사드립니다.
"위치"에 포함 된 정보에 따라 다릅니다. 위치 자체이기 때문에 위치를 시간대 이름 (예 : Olson 스타일의 표준 시간대 이름)으로 매핑해야합니다. 더 자세하고 쉽게 매핑 할 수 있기 때문에 위치 자체입니다.
대략적인 주소 (국가 및 도시 등) 인 경우 몇 가지 위치 정보 서비스는 정보에 시간대를 포함하므로 이러한 서비스를 호출하고 볼 수 있습니다.
위도와 경도가있는 지구 위치 정보가 있으면 Earthtools라는 사이트에서 시간대를 지정할 수 있습니다. http://www.earthtools.org/webservices.htm#timezone
이 시간대에 도시에서 매핑과 국가를 제공하는이 데이터베이스입니다: http://citytimezones.info/cms/pending_requests.htm
불행히도 윈도우 시간대 이름을 사용,하지만 당신은 Unicode.org에서이 데이터를 http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml 윈도우 시간대 이름과 올슨 사이에 매핑 할 수 있습니다 TZ 이름.
도시, 주, 나라 – samsina
@samsina : 업데이트 도움이 될만한 몇 가지 링크가 있습니다. –
참고 사항 [이 커뮤니티 위키 항목] (http://stackoverflow.com/q/16086962/634824) –
사실이하지 않은 그러나 다음과 같은 작업을해야합니다 : 먼저 도시 국가 국가의 위도/경도를 얻을 수 GeoGoogle 자바 라이브러리를 사용할 수 있습니다
.
다음, 당신은 시간대 :
우리는 사용자의 위치에 관한 정보를 얻을 수있는 MaxMind GeoIP database를 사용하는을 얻을 수 레나 언급 EarthTools (그리고 자신의 일부 자바 코드)를 사용할 수 있습니다 . 그들은 유료 버전 (99.8 % 정확도)과 free version (99.5 % 정확도)을 가지고 있습니다.
또한 Java, C, PHP 등의 API를 제공하므로 데이터베이스를 쿼리하여 로컬에서 다운로드하고 유지할 수 있습니다 (매월 업데이트 제공). 이 데이터베이스는 고객의 도시, 주, 국가 등의 정보를 IP 주소를 기반으로 제공합니다.
희망이 도움이됩니다.
나도 사용하지만 시간대에 대한 정보는 제공하지 않습니다 (무료 버전을 사용하고 있습니다. 유료 버전에 대해 안다) –
Try this code for use Google Time Zone API from Java:
String get_xml_server_reponse(String server_url){
URL xml_server = null;
String xmltext = "";
InputStream input;
try {
xml_server = new URL(server_url);
try {
input = xml_server.openConnection().getInputStream();
final BufferedReader reader = new BufferedReader(new InputStreamReader(input));
final StringBuilder sBuf = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null)
{
sBuf.append(line);
}
}
catch (IOException e)
{
Log.e(e.getMessage(), "XML parser, stream2string 1");
}
finally {
try {
input.close();
}
catch (IOException e)
{
Log.e(e.getMessage(), "XML parser, stream2string 2");
}
}
xmltext = sBuf.toString();
} catch (IOException e1) {
e1.printStackTrace();
}
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
return xmltext;
}
private String get_UTC_Datetime_from_timestamp(long timeStamp){
try{
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
int tzt = tz.getOffset(System.currentTimeMillis());
timeStamp -= tzt;
// DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.getDefault());
DateFormat sdf = new SimpleDateFormat();
Date netDate = (new Date(timeStamp));
return sdf.format(netDate);
}
catch(Exception ex){
return "";
}
}
class NTP_UTC_Time
{
private static final String TAG = "SntpClient";
private static final int RECEIVE_TIME_OFFSET = 32;
private static final int TRANSMIT_TIME_OFFSET = 40;
private static final int NTP_PACKET_SIZE = 48;
private static final int NTP_PORT = 123;
private static final int NTP_MODE_CLIENT = 3;
private static final int NTP_VERSION = 3;
// Number of seconds between Jan 1, 1900 and Jan 1, 1970
// 70 years plus 17 leap days
private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L;
private long mNtpTime;
public boolean requestTime(String host, int timeout) {
try {
DatagramSocket socket = new DatagramSocket();
socket.setSoTimeout(timeout);
InetAddress address = InetAddress.getByName(host);
byte[] buffer = new byte[NTP_PACKET_SIZE];
DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT);
buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3);
writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET);
socket.send(request);
// read the response
DatagramPacket response = new DatagramPacket(buffer, buffer.length);
socket.receive(response);
socket.close();
mNtpTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET);
} catch (Exception e) {
// if (Config.LOGD) Log.d(TAG, "request time failed: " + e);
return false;
}
return true;
}
public long getNtpTime() {
return mNtpTime;
}
/**
* Reads an unsigned 32 bit big endian number from the given offset in the buffer.
*/
private long read32(byte[] buffer, int offset) {
byte b0 = buffer[offset];
byte b1 = buffer[offset+1];
byte b2 = buffer[offset+2];
byte b3 = buffer[offset+3];
// convert signed bytes to unsigned values
int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0);
int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1);
int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2);
int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3);
return ((long)i0 << 24) + ((long)i1 << 16) + ((long)i2 << 8) + (long)i3;
}
/**
* Reads the NTP time stamp at the given offset in the buffer and returns
* it as a system time (milliseconds since January 1, 1970).
*/
private long readTimeStamp(byte[] buffer, int offset) {
long seconds = read32(buffer, offset);
long fraction = read32(buffer, offset + 4);
return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L)/0x100000000L);
}
/**
* Writes 0 as NTP starttime stamp in the buffer. --> Then NTP returns Time OFFSET since 1900
*/
private void writeTimeStamp(byte[] buffer, int offset) {
int ofs = offset++;
for (int i=ofs;i<(ofs+8);i++)
buffer[i] = (byte)(0);
}
}
String get_time_zone_time(GeoPoint gp){
String erg = "";
String raw_offset = "";
String dst_offset = "";
double Longitude = gp.getLongitudeE6()/1E6;
double Latitude = gp.getLatitudeE6()/1E6;
// String request = "http://ws.geonames.org/timezone?lat="+Latitude+"&lng="+ Longitude+ "&style=full";
long tsLong = 0; // System.currentTimeMillis()/1000;
NTP_UTC_Time client = new NTP_UTC_Time();
if (client.requestTime("pool.ntp.org", 2000)) {
tsLong = client.getNtpTime();
}
if (tsLong != 0)
{
tsLong = tsLong/1000;
// https://maps.googleapis.com/maps/api/timezone/xml?location=39.6034810,-119.6822510×tamp=1331161200&sensor=true
String request = "https://maps.googleapis.com/maps/api/timezone/xml?location="+Latitude+","+ Longitude+ "×tamp="+tsLong +"&sensor=true";
String xmltext = get_xml_server_reponse(request);
if(xmltext.compareTo("")!= 0)
{
int startpos = xmltext.indexOf("<TimeZoneResponse");
xmltext = xmltext.substring(startpos);
XmlPullParser parser;
try {
parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new StringReader (xmltext));
int eventType = parser.getEventType();
String tagName = "";
while(eventType != XmlPullParser.END_DOCUMENT) {
switch(eventType) {
case XmlPullParser.START_TAG:
tagName = parser.getName();
break;
case XmlPullParser.TEXT :
if (tagName.equalsIgnoreCase("raw_offset"))
if(raw_offset.compareTo("")== 0)
raw_offset = parser.getText();
if (tagName.equalsIgnoreCase("dst_offset"))
if(dst_offset.compareTo("")== 0)
dst_offset = parser.getText();
break;
}
try {
eventType = parser.next();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (XmlPullParserException e) {
e.printStackTrace();
erg += e.toString();
}
}
int ro = 0;
if(raw_offset.compareTo("")!= 0)
{
float rof = str_to_float(raw_offset);
ro = (int)rof;
}
int dof = 0;
if(dst_offset.compareTo("")!= 0)
{
float doff = str_to_float(dst_offset);
dof = (int)doff;
}
tsLong = (tsLong + ro + dof) * 1000;
erg = get_UTC_Datetime_from_timestamp(tsLong);
}
return erg;
}
과 함께 사용 :
GeoPoint gp = new GeoPoint(39.6034810,-119.6822510);
String Current_TimeZone_Time = get_time_zone_time(gp);
이 코드는 너무 나쁘기 때문에 눈이 피였다. –
이 대답은 중대하다 : http://stackoverflow.com/a/16086964/1121497는 –