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"。您必须执行与问题中看到的相同类型的代码。