简体   繁体   中英

Timestamp to Date/Time

I am trying to make a football Livescore app. And I need to show the match time to users as their local match time.
if I was generated a Timestamp from a given timezone, lets say it is

autodatetime(1517009400,6.5); //original timezone included    
//I can make it done in javascript by https://www.autodatetime.com/

But I was trying to get it from Android with this code

public String getconvertedtime(long timestamp) {
    try{

        Toast.makeText(getApplicationContext(),Integer.toString(TimeZone.getDefault().getDSTSavings()),Toast.LENGTH_LONG).show();

        Calendar calendar = Calendar.getInstance();
        TimeZone tz = TimeZone.getDefault();
        //getTimezonedifference() return 0 for me
        timestamp= timestamp-getTimezonedifference();
        calendar.setTimeInMillis(timestamp * 1000);
        calendar.add(Calendar.MILLISECOND, (tz.getOffset(calendar.getTimeInMillis())-tz.getDSTSavings()));
        DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss aa");
        Date currentTimeZone = calendar.getTime();
        return dateFormat.format(currentTimeZone);
    }catch (Exception e) {
        return "";
    }

}
public int getTimezonedifference() {

    TimeZone tz = TimeZone.getDefault();
    Calendar cal = GregorianCalendar.getInstance(tz);
    double offsetInMillis = tz.getOffset(cal.getTimeInMillis());
    //String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
    //offset = "GMT"+(offsetInMillis >= 0 ? "+" : "-") + offset;
    offsetInMillis= Math.abs((offsetInMillis)-(6.5*3600000));
    int vall=(int)offsetInMillis;
    return vall;
}

Unfortunately It was returning wrong time, I can't figure it out why it was showing faster hours .

The result is 01/27/2018 12:30:00 PM
It must be 01/26/2018 11:30:00 PM for my Local TimeZone(6.5)



And I found something about different DST problems from googling and get 0 from "TimeZone.getDefault().getDSTSavings()" on Toast.

Please guide me to the solution, I am new to android programming. Thank you for reading.

Given epoch of 1517009400 , which is 01/26/2018 23:30:00 GMT , to show this time in user's local time:

// convert to epoch milli seconds
long ts = 1517009400000l;
Date date = new Date(ts);

DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
String dateStr = dateFormat.format(date);

android.util.Log.i("TEST", "dateStr: " + dateStr);

dateStr will be formatted according to timezone of user's phone. For example, my phone is set to Asia/Kuala_Lumpur timezone, which is GMT+8 , so it shows 01/27/2018 07:30:00 .

To format date string into particular timezone (eg: New York), you can try this:

DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("America/New_York"));
String dateStr = dateFormat.format(date);

This outputs 01/26/2018 18:30:00 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM