Попробуйте: это пример, когда мы берем время с NTP.
SntpClient client = new SntpClient();
String dateFromNtpServer = "";
if (client.requestTime("0.us.pool.ntp.org", 30000)) {
time = client.getNtpTime();
newTime = time;
Log.d("shetty", newTime + "....newTime");
Calendar calendar = Calendar.getInstance();
try {
calendar.setTimeInMillis(time);
calendar.getTime();
GMTtoEST gmttoest = new GMTtoEST();
dateFromNtpServer = gmttoest
.ReturnMeEst(calendar.getTime());
dateFromNtpServer = dateFromNtpServer + " EST";
} catch (Exception e) {
// TODO: handle exception
dateFromNtpServer = "No Response from NTP";
}
}
2) GMTToEst.java
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class GMTtoEST {
public static void main(String args[]) {
Date date = new Date();
DateFormat estFormat = new SimpleDateFormat();
DateFormat gmtFormat = new SimpleDateFormat();
TimeZone gmtTime = TimeZone.getTimeZone("GMT");
TimeZone estTime = TimeZone.getTimeZone("EST");
estFormat.setTimeZone(gmtTime);
gmtFormat.setTimeZone(estTime);
System.out.println("GMT Time: " + estFormat.format(date));
System.out.println("EST Time: " + gmtFormat.format(date));
}
public String ReturnMeEst(Date GmtTime) {
// Date date = new Date();
DateFormat estFormat = new SimpleDateFormat();
DateFormat gmtFormat = new SimpleDateFormat();
TimeZone gmtTime = TimeZone.getTimeZone("GMT");
TimeZone estTime = TimeZone.getTimeZone("EST");
estFormat.setTimeZone(gmtTime);
String timeInGmt = "";
gmtFormat.setTimeZone(estTime);
// System.out.println("GMT Time: " + estFormat.format(date));
System.out.println("EST Time: " + gmtFormat.format(GmtTime));
timeInGmt = gmtFormat.format(GmtTime);
return timeInGmt;
}
}
3) SntpClient.java
<code>import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.os.SystemClock;
import android.util.Config;
import android.util.Log;
/**
* {@hide}
*
* Simple SNTP client class for retrieving network time.
*
* Sample usage:
* <pre>SntpClient client = new SntpClient();
* if (client.requestTime("time.foo.com")) {
* long now = client.getNtpTime() + SystemClock.elapsedRealtime() - client.getNtpTimeReference();
* }
*
* / public class SntpClient {приватная статическая конечная строка String TAG = "SntpClient";private static final int REFERENCE_TIME_OFFSET = 16;private static final int ORIGINATE_TIME_OFFSET = 24;private static final int RECEIVE_TIME_OFFSET = 32;private static final int TRANSMIT_TIME_OFFSET = 40;private static final int NTP_PACKET_SIZE = 48;приватная статическая final int NTP_PORT = 123;private static final int NTP_MODE_CLIENT = 3;приватная статическая final int NTP_VERSION = 3;// Количество секунд между 1 января 1900 года и 1 января 1970 года // 70 лет плюс 17 високосных дней приватной статической конечной длины OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L;// системное время, вычисленное по ответу сервера NTP private long mNtpTime;// значение SystemClock.elapsedRealtime (), соответствующее mNtpTime private long mNtpTimeReference;// время приема-передачи в миллисекундах private long mRoundTripTime;/ ** * Отправляет SNTP-запрос данному хосту и обрабатывает ответ.* * @param host host name сервера.* @param timeout сетевое время ожидания в миллисекундах.* @ return true, если транзакция прошла успешно.* / public boolean requestTime (String host, int timeout) {try {DatagramSocket socket = new DatagramSocket ();socket.setSoTimeout (тайм-аут)InetAddress address = InetAddress.getByName (host);byte [] buffer = новый байт [NTP_PACKET_SIZE];DatagramPacket request = new DatagramPacket (buffer, buffer.length, address, NTP_PORT);// set mode = 3 (client) и version = 3 // mode находится в младших 3 битах первого байта // версия находится в битах 3-5 буфера первого байта [0] = NTP_MODE_CLIENT |(NTP_VERSION << 3);// получить текущее время и записать его в пакет запроса long requestTime = System.currentTimeMillis ();long requestTicks = SystemClock.elapsedRealtime ();writeTimeStamp (буфер, TRANSMIT_TIME_OFFSET, requestTime);socket.send (запрос);// читаем ответ DatagramPacket response = new DatagramPacket (buffer, buffer.length);socket.receive (ответ);long responseTicks = SystemClock.elapsedRealtime ();long responseTime = requestTime + (responseTicks - requestTicks);socket.close ();// извлекать результаты long originateTime = readTimeStamp (buffer, ORIGINATE_TIME_OFFSET);long receiveTime = readTimeStamp (буфер, RECEIVE_TIME_OFFSET);long transTime = readTimeStamp (буфер, TRANSMIT_TIME_OFFSET);long roundTripTime = responseTicks - requestTicks - (TransferTime - receiveTime);// receiveTime = originateTime + Transit + Skew // responseTime = TransmitTime + Transit - Skew // ClockOffset = ((receiveTime - originateTime) + (TransferTime - responseTime)) / 2 // = ((originateTime + транзит + skew - originateTime)+ // (TransmitTime - (TransmitTime + Transit - Skew))) / 2 // = ((Transit + Skew) + (TransmitTime - TransmitTime - Transit + Skew)) / 2 // = (Transit + Skew - Transit + Skew) / 2 // = (2 * skew) / 2 = skew long clockOffset = ((receiveTime - originateTime) + (transTime - responseTime)) / 2;// if (Config.LOGD) Log.d (TAG, "round trip:" + roundTripTime + "ms");// if (Config.LOGD) Log.d (TAG, "смещение часов:" + clockOffset + "ms");// сохранить наши результаты - использовать время на этой стороне задержки сети // (ответ, а не время запроса) mNtpTime = responseTime + clockOffset;mNtpTimeReference = responseTicks;mRoundTripTime = roundTripTime;} catch (Exception e) {if (Config.LOGD) Log.d (TAG, "время запроса не выполнено:" + e);вернуть ложь;} вернуть истину;} / ** * Возвращает время, вычисленное по транзакции NTP.* * Значение времени возврата @ вычисляется из ответа сервера NTP.* / public long getNtpTime () {return mNtpTime;} / ** * Возвращает эталонное значение часов (значение SystemClock.elapsedRealtime ()) *, соответствующее времени NTP.* * @ возвращают опорные часы, соответствующие времени NTP.* / public long getNtpTimeReference () {return mNtpTimeReference;} / ** * Возвращает время приема-передачи транзакции NTP * * @ return время возврата в миллисекундах.* / public long getRoundTripTime () {return mRoundTripTime;} / ** * Считывает беззнаковое 32-разрядное старшее порядковое число из заданного смещения в буфере.* / private long read32 (буфер byte [], смещение int) {byte b0 = buffer [offset];байт b1 = буфер [смещение + 1];байт b2 = буфер [смещение + 2];байт b3 = буфер [смещение + 3];// преобразовать подписанные байты в значения без знака 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;} / ** * Считывает метку времени NTP с заданным смещением в буфере и возвращает * ее как системное время (миллисекунды с 1 января 1970 года) * / public long readTimeStamp (byte [] buffer, int offset) {long seconds= read32 (буфер, смещение);длинная дробь = read32 (буфер, смещение + 4);возврат ((секунды - OFFSET_1900_TO_1970) * 1000) + ((дробь * 1000L) / 0x100000000L);} / ** * Записывает системное время (в миллисекундах с 1 января 1970 года) как отметку времени NTP * с заданным смещением в буфере.* / private void writeTimeStamp (буфер byte [], int offset, long time) {длинные секунды = время / 1000L;длинные миллисекунды = время - секунды * 1000 л;секунд + = OFFSET_1900_TO_1970;// записывать секунды в формате с прямым порядком байтов [offset ++] = (byte) (секунды >> 24);buffer [offset ++] = (byte) (секунд >> 16);buffer [offset ++] = (byte) (секунд >> 8);buffer [offset ++] = (byte) (секунд >> 0);длинная дробь = миллисекунды * 0x100000000L / 1000L;// записать дробь в формате с прямым порядком байтов [offset ++] = (byte) (дробь >> 24);buffer [offset ++] = (byte) (дробь >> 16);buffer [offset ++] = (byte) (дробь >> 8);// младшие биты должны быть случайным буфером данных [offset ++] = (byte) (Math.random () * 255.0);}}