2016-05-04 38 views
0

我将日期存储在UTC长,并在用户时区显示。但是,当我试图只留下几天没有时间误导不同日期。不计时间转换日期不同时区

例如:05/06/2016(2016年5月6日)的计划事件。这个日期对于没有时区的所有地区都是唯一的。如果用户来自GMT + 5:30时区试图在05/06/2016上添加事件,那么它的ISO-8601格式为2016-05-05T16:00:00.000Z并且毫秒为。

然后从GMT时区的用户尝试查看此事件。日期将是05/05/2016而不是05/06/2016

有什么办法可以在没有任何时区的情况下转换日期。

+0

为什么在计算和显示仅日期部分时不考虑时间?例如。您将您的活动日期创建为2016-06-05T05:30:00.000Z,将其转换为目标时区(如果需要)并仅显示日期部分? – Aakash

+0

“*我将日期存储在UTC *”=>您在哪里存储它?在一个变量?在数据库中?如果在数据库中,什么是列类型?等等 – assylias

回答

1

总是存储整个timestap。 只要你想显示只是将时间戳转换为你想要将其转换为&显示它的任何时区。

这将有助于转换:(时间戳为日期或viseversa)

// timestamp to Date 
long timestamp = 5607059900000; //Example -> in ms 
Date d = new Date(timestamp); 

// Date to timestamp 
long timestamp = d.getTime(); 

//If you want the current timestamp : 
Calendar c = Calendar.getInstance(); 
long timestamp = c.getTimeInMillis(); 

参见:convert TimeStamp to Date in Java

您可以使用SimpleDateFormat显示不同的日期格式。

如:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MainClass { 
    public static void main(String[] args) { 
    String pattern = "MM/dd/yyyy"; 
    SimpleDateFormat format = new SimpleDateFormat(pattern); 
    try { 
     Date date = format.parse("12/31/2006"); 
     System.out.println(date); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    // formatting 
    System.out.println(format.format(new Date())); 
    } 
} 
2

的Java 8为您问题的解决方案。如果您可以使用Java 8,则使用java.time.LocalDate,它仅表示没有时间的日期。存储由toEpochDay方法返回的long值。 下面给出了一个示例代码:

LocalDate date = LocalDate.of(2016, 5, 4); 
// Store this long value 
long noOfDays = date.toEpochDay(); // No of days from 1970-01-01 
LocalDate newDate = LocalDate.ofEpochDay(noOfDays); 
System.out.println(newDate); // 2016-05-04 
相关问题