【问题标题】:Converting date without time for different timezone为不同时区转换没有时间的日期
【发布时间】:2016-08-29 07:58:39
【问题描述】:

我将日期存储在 UTC 中,并以用户时区显示。但是,当我尝试只存储没有时间的日子时,它会误导不同的日期。

例如:在 2016 年 5 月 6 日(2016 年 5 月 6 日)安排活动。此日期对于所有没有时区的地区都是唯一的。如果来自 GMT+5:30 时区的用户尝试在 05/06/2016 上添加事件,则 ISO-8601 格式为 2016-05-05T16:00:00.000Z > 毫秒为 1462464000000

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

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

【问题讨论】:

  • 在计算和显示日期部分时为什么不考虑时间?例如。您将事件日期创建为 2016-06-05T05:30:00.000Z,将其转换为目标时区(如果需要)并仅显示日期部分?
  • "我将日期存储在 UTC" => 你在哪里存储它?在变量中?在数据库中?如果在数据库中,列类型是什么?等

标签: java date datetime jodatime java-time


【解决方案1】:

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

【讨论】:

  • 如果使用 Java 6 或 7,您仍然可以使用此解决方案。 java.time,现代 Java 日期和时间 API,已被向后移植。将ThreeTen Backport 添加到您的项目中即可。
【解决方案2】:

始终存储整个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()));
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2015-07-15
    • 2019-06-21
    • 2021-01-05
    相关资源
    最近更新 更多