知道为什么我总是得到"Sat 17th"日期(日历)- java吗?


 public static void main(String[] args) {
   JsonWeatherTime time = new JsonWeatherTime();
   String date = time.formatDate(Long.valueOf(1454691600));  //Todays date
    System.out.println(date);
  }
 private String formatDate(long milliseconds){
    StringBuffer dateBuffer = new StringBuffer();
    Calendar     calendar = Calendar.getInstance();
    calendar.setTimeInMillis(milliseconds);
    switch(calendar.get(Calendar.DAY_OF_WEEK)){
    case Calendar.MONDAY: dateBuffer.append("MON, ");
    break;
    case Calendar.TUESDAY:dateBuffer.append("TUE, ");
    break;
    case Calendar.WEDNESDAY:dateBuffer.append("WED," );
    break;
    case Calendar.THURSDAY:dateBuffer.append("THUR, ");
    break;
    case Calendar.FRIDAY:dateBuffer.append("FRI, ");
    break;
    case Calendar.SATURDAY:dateBuffer.append("SAT, ");
    break;
    case Calendar.SUNDAY:dateBuffer.append("SUN, ");
    break;
    default:dateBuffer.append("N/A");
  }
 String day_of_week = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
    if(day_of_week.equals("1") | day_of_week.equals("21") | day_of_week.equals("31") ) day_of_week += "st";
    else if(day_of_week.equals("2") | day_of_week.equals("22") ) day_of_week += "nd";
    else if(day_of_week.equals("3") | day_of_week.equals("23")) day_of_week += "rd";
    else day_of_week += "th";
 //Log.d("JSONPARSE", "THE VALUE OF THE DATE ISSSSSS" + day_of_week);
  dateBuffer.append(day_of_week);
  return dateBuffer.toString();
 }

我正在解析来自 OpenWeatherMap API 的 json 天气数据,无论我解析的日期值是多少(以毫秒为单位通过 json(,日历都会返回 17 日星期六的日期。我不完全熟悉使用日期,但是 json 在 UNIX 时间中返回一个毫秒字符串,如果我传入今天的日期 (1454691600(,该字符串应为(星期五,6 日(,尽管它返回(星期六,17 日(。知道我在这里做错了什么吗?

1454691600的值以为单位,而不是毫秒。

Date date = new Date(1454691600 * 1000L);
SimpleDateFormat dateFmt = new SimpleDateFormat("EEE, d");
System.out.println(dateFmt.format(date)); // prints: Fri, 5
System.out.println(date); // prints: Fri Feb 05 12:00:00 EST 2016

JSON 在几秒钟内返回值,而不是在毫秒内返回值。

public static void main(String[] args) {
    String date = formatDate(Long.valueOf(TimeUnit.SECONDS.toMillis(
            1454691600)));  //Todays date
    System.out.println(date); // FRI, 5th
}

此代码工作正常并打印预期日期:5 日星期五

其他答案是正确的,您的数字似乎是整秒,而不是从纪元开始的毫秒数。

java.time

仅供参考,您正在使用与最早版本的 Java 捆绑在一起的旧日期时间类。事实证明,它们很麻烦,设计也很差。Java 8 及更高版本用 java.time 框架取代了这些旧类。

解析编号

Instant是时间轴上以 UTC 为单位的时刻,分辨率为纳秒。在下面的代码中,请注意将数字整数标记为long(64 位整数(L

Instant instant = Instant.ofEpochSecond( 1454691600L );

时区

时区对于确定日期至关重要。如果未指定时区,那么旧类(如问题中所示(和 java.time 类都将静默应用 JVM 的当前缺省时区。最好明确说明您想要/期望的时区。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

本地化的日期名称

若要获取当天的本地化名称,请使用 DayOfWeek 枚举。我们在这里要求魁北克法语来说明这一点。您可以指定 Locale.ENGLISH 或 Locale.US,依此类推。与时区一样,我强烈建议始终指定您想要/预期的区域设置,而不是隐式依赖 JVM 的当前默认语言环境,即使在运行时也可以随时更改。

DayOfWeek dayOfWeek = DayOfWeek.from( zdt );
String nameOfDay = dayOfWeek.getDisplayName( TextStyle.SHORT , Locale.CANADA_FRENCH ); // Or Locale.ENGLISH or Locale.US, and so on.

转储到控制台。

System.out.println ( "instant: " + instant + " | zoneId:  " + zoneId + " | zdt: " + zdt + " | dayOfWeek: " + dayOfWeek + " | nameOfDay: " + nameOfDay );
即时: 2016-02-05T17:00:00Z | 区域 ID: 美国/

蒙特利尔 | ZDT: 2016-02-05T12:00-05:00[美国/蒙特利尔] | 星期几: 星期五 | 名称一天: ven.

序数指示器

我所知,java.time 框架并不能帮助您获取序号指示符,例如"st"或"th"。您必须执行与问题中看到的相同类型的代码。

最新更新