How to convert UTC timestamp to device local time in android

后端 未结 9 1829
孤独总比滥情好
孤独总比滥情好 2020-11-29 21:24

I need to convert the UTC time stamp that i get from the server to local device time. currently i get 5 hrs difference in my time. for example when i post to server the post

相关标签:
9条回答
  • 2020-11-29 21:31

    I did it using Extension Functions in kotlin

    fun String.toDate(dateFormat: String = "yyyy-MM-dd HH:mm:ss", timeZone: TimeZone = TimeZone.getTimeZone("UTC")): Date {
        val parser = SimpleDateFormat(dateFormat, Locale.getDefault())
        parser.timeZone = timeZone
        return parser.parse(this)
    }
    
    fun Date.formatTo(dateFormat: String, timeZone: TimeZone = TimeZone.getDefault()): String {
        val formatter = SimpleDateFormat(dateFormat, Locale.getDefault())
        formatter.timeZone = timeZone
        return formatter.format(this)
    }
    

    Usage:

    "2018-09-10 22:01:00".toDate().formatTo("dd MMM yyyy")
    
    Output: "11 Sep 2018"
    

    Note:

    Ensure the proper validation.

    0 讨论(0)
  • 2020-11-29 21:34

    Converting a date String of the format "2011-06-23T15:11:32" to our time zone.

    private String getDate(String ourDate)
    {
        try
        {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
            Date value = formatter.parse(ourDate);
    
            SimpleDateFormat dateFormatter = new SimpleDateFormat("MM-dd-yyyy HH:mm"); //this format changeable
            dateFormatter.setTimeZone(TimeZone.getDefault());
            ourDate = dateFormatter.format(value);
    
            //Log.d("ourDate", ourDate);
        }
        catch (Exception e)
        {
            ourDate = "00-00-0000 00:00";
        }
      return ourDate;
    }
    
    0 讨论(0)
  • 2020-11-29 21:35

    I have do something like this to get date in local device timezone from UTC time stamp.

    private long UTC_TIMEZONE=1470960000;
    private String OUTPUT_DATE_FORMATE="dd-MM-yyyy - hh:mm a"
    
    getDateFromUTCTimestamp(UTC_TIMEZONE,OUTPUT_DATE_FORMATE);
    

    Here is the function

     public String getDateFromUTCTimestamp(long mTimestamp, String mDateFormate) {
            String date = null;
            try {
                Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
                cal.setTimeInMillis(mTimestamp * 1000L);
                date = DateFormat.format(mDateFormate, cal.getTimeInMillis()).toString();
    
                SimpleDateFormat formatter = new SimpleDateFormat(mDateFormate);
                formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
                Date value = formatter.parse(date);
    
                SimpleDateFormat dateFormatter = new SimpleDateFormat(mDateFormate);
                dateFormatter.setTimeZone(TimeZone.getDefault());
                date = dateFormatter.format(value);
                return date;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return date;
        }
    

    Result :

    12-08-2016 - 04:30 PM 
    

    Hope this will work for others.

    0 讨论(0)
  • 2020-11-29 21:40

    The answer from @prgDevelop returns 0 on my Android Marsmallow. Must return 7200000. These changes make it work fine:

    int offset = TimeZone.getTimeZone(Time.getCurrentTimezone()).getRawOffset() + TimeZone.getTimeZone(Time.getCurrentTimezone()).getDSTSavings();
    
    0 讨论(0)
  • 2020-11-29 21:43

    Local to UTC

    DateTime dateTimeNew = new DateTime(date.getTime(),
    DateTimeZone.forID("Asia/Calcutta"));
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    String datetimeString = dateTimeNew.toString("yyyy-MM-dd HH:mm:ss");
    long milis = 0;
    try {
         milis = simpleDateFormat.parse(datetimeString).getTime();
    } catch (ParseException e) {
       e.printStackTrace();
    }
    
    0 讨论(0)
  • 2020-11-29 21:46

    It's Working

    Call this method where you use

    SntpClient client = new SntpClient();
    if (client.requestTime("ntp.ubuntu.com", 30000)) {
      long now = client.getNtpTime();
      Date current = new Date(now);
    
      date2 = sdf.parse(new Date(current.getTime()).toString());
     // System.out.println(current.toString());
      Log.e(TAG, "testing SntpClient time current.toString() "+current.toString()+" , date2 = "+date2);
    }
    
    =====================================================   
    
    import android.os.SystemClock;
    import android.util.Log;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /**
     * {@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();
     * }
     * </pre>
     */
    public class SntpClient
    {
      private static final 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;
    
      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;
    
      // system time computed from NTP server response
      private long mNtpTime;
    
      // value of SystemClock.elapsedRealtime() corresponding to mNtpTime
      private long mNtpTimeReference;
    
      // round trip time in milliseconds
      private long mRoundTripTime;
    
      /**
       * Sends an SNTP request to the given host and processes the response.
       *
       * @param host host name of the server.
       * @param timeout network timeout in milliseconds.
       * @return true if the transaction was successful.
       */
      public boolean requestTime(String host, int timeout) {
        DatagramSocket socket = null;
        try {
          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);
    
          // set mode = 3 (client) and version = 3
          // mode is in low 3 bits of first byte
          // version is in bits 3-5 of first byte
          buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3);
    
          // get current time and write it to the request packet
          long requestTime = System.currentTimeMillis();
          long requestTicks = SystemClock.elapsedRealtime();
          writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET, requestTime);
    
          socket.send(request);
    
          // read the response
          DatagramPacket response = new DatagramPacket(buffer, buffer.length);
          socket.receive(response);
          long responseTicks = SystemClock.elapsedRealtime();
          long responseTime = requestTime + (responseTicks - requestTicks);
    
          // extract the results
          long originateTime = readTimeStamp(buffer, ORIGINATE_TIME_OFFSET);
          long receiveTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET);
          long transmitTime = readTimeStamp(buffer, TRANSMIT_TIME_OFFSET);
          long roundTripTime = responseTicks - requestTicks - (transmitTime - receiveTime);
          // receiveTime = originateTime + transit + skew
          // responseTime = transmitTime + transit - skew
          // clockOffset = ((receiveTime - originateTime) + (transmitTime - responseTime))/2
          //             = ((originateTime + transit + 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) + (transmitTime - responseTime))/2;
          // if (false) Log.d(TAG, "round trip: " + roundTripTime + " ms");
          // if (false) Log.d(TAG, "clock offset: " + clockOffset + " ms");
    
          // save our results - use the times on this side of the network latency
          // (response rather than request time)
          mNtpTime = responseTime + clockOffset;
          mNtpTimeReference = responseTicks;
          mRoundTripTime = roundTripTime;
        } catch (Exception e) {
          if (false) Log.d(TAG, "request time failed: " + e);
          return false;
        } finally {
          if (socket != null) {
            socket.close();
          }
        }
    
        return true;
      }
    
      /**
       * Returns the time computed from the NTP transaction.
       *
       * @return time value computed from NTP server response.
       */
      public long getNtpTime() {
        return mNtpTime;
      }
    
      /**
       * Returns the reference clock value (value of SystemClock.elapsedRealtime())
       * corresponding to the NTP time.
       *
       * @return reference clock corresponding to the NTP time.
       */
      public long getNtpTimeReference() {
        return mNtpTimeReference;
      }
    
      /**
       * Returns the round trip time of the NTP transaction
       *
       * @return round trip time in milliseconds.
       */
      public long getRoundTripTime() {
        return mRoundTripTime;
      }
    
      /**
       * 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 system time (milliseconds since January 1, 1970) as an NTP time stamp
       * at the given offset in the buffer.
       */
      private void writeTimeStamp(byte[] buffer, int offset, long time) {
        long seconds = time / 1000L;
        long milliseconds = time - seconds * 1000L;
        seconds += OFFSET_1900_TO_1970;
    
        // write seconds in big endian format
        buffer[offset++] = (byte)(seconds >> 24);
        buffer[offset++] = (byte)(seconds >> 16);
        buffer[offset++] = (byte)(seconds >> 8);
        buffer[offset++] = (byte)(seconds >> 0);
    
        long fraction = milliseconds * 0x100000000L / 1000L;
        // write fraction in big endian format
        buffer[offset++] = (byte)(fraction >> 24);
        buffer[offset++] = (byte)(fraction >> 16);
        buffer[offset++] = (byte)(fraction >> 8);
        // low order bits should be random data
        buffer[offset++] = (byte)(Math.random() * 255.0);
      }
    }
    
    0 讨论(0)
提交回复
热议问题