时区 - 如何?
Time zones - how to?
最终目标是将从服务器传递下来的时间戳转换为本地时间。
这是我得到的:
2018-04-05T16:14:19.130Z
然而,我的当地时间是11:14 AM CST
。这是我尝试过的:
final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
final LocalTime localTime = formatter.parseLocalTime(text);
Timber.i(localTime.toString()); // output: 16:14:19.070
输出为:16:14:19.070
。有人知道如何使用它吗?我希望收到类似 11:14 AM
.
的内容
另外,我试过使用这个:
final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
final DateTime time = formatter.parseDateTime(text);
Timber.i(time.toString()); // output: 2018-04-05T16:14:19.490-05:00
好像有5个小时的时差?有人知道我如何使用它来转换为本地时间吗?
使用此方法将您的时间转换为本地时间:
public static String convertTimeToLocal(String dateStr) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = format.parse(dateStr);
System.out.println(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String timeZone = Calendar.getInstance().getTimeZone().getID();
Date local = new Date(date.getTime() + TimeZone.getTimeZone(timeZone).getOffset(date.getTime()));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
String reportDate = df.format(local);
return reportDate;
}
& 对于上午和下午,使用此方法:
public static String convertTimeToAmPm(String time) {
List<String> arr = Arrays.asList(time.split(":"));
int hours = Integer.parseInt(arr.get(0));
int mins = Integer.parseInt(arr.get(1));
String timeSet = "";
if (hours > 12) {
hours -= 12;
timeSet = "PM";
} else if (hours == 0) {
hours += 12;
timeSet = "AM";
} else if (hours == 12)
timeSet = "PM";
else
timeSet = "AM";
String minutes = "";
if (mins < 10)
minutes = "0" + mins;
else
minutes = String.valueOf(mins);
// Append in a StringBuilder
String aTime = new StringBuilder().append(hours).append(':')
.append(minutes).append(" ").append(timeSet).toString();
return aTime;
}
最后的"Z"就是date/time is in UTC。如果将它放在引号内,它会被视为文字(字母 "Z" 本身)并且它失去了这种特殊含义 - 你基本上丢弃了它在 UTC 中的信息,并且 DateTime
假设JVM 默认时区(这就是为什么您的第二次尝试在 UTC-05:00 中导致 16:14)。
DateTime
可以直接解析这个输入:
String input = "2018-04-05T16:14:19.130Z";
DateTime dt = DateTime.parse(input);
然后将其转换为所需的时区。你可以这样做:
dt = dt.withZone(DateTimeZone.getDefault());
这将使用您的 JVM 的默认时区。但这并不是那么可靠,因为默认值可以在运行时更改 - 即使是同一 JVM 中的其他应用程序 运行 - 所以最好使用明确的时区:
dt = dt.withZone(DateTimeZone.forID("America/Chicago"));
然后就可以转换成你想要的格式了:
String time = dt.toString("hh:mm a"); // 11:14 AM
如果需要使用格式化程序,可以去掉"Z"两边的引号,同时在格式化程序中设置时区:
DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
// zone to be used for the formatter
.withZone(DateTimeZone.forID("America/Chicago"));
DateTime dateTime = parser.parseDateTime("2018-04-05T16:14:19.130Z");
String time = dateTime.toString("hh:mm a"); // 11:14 AM
最终目标是将从服务器传递下来的时间戳转换为本地时间。
这是我得到的:
2018-04-05T16:14:19.130Z
然而,我的当地时间是11:14 AM CST
。这是我尝试过的:
final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
final LocalTime localTime = formatter.parseLocalTime(text);
Timber.i(localTime.toString()); // output: 16:14:19.070
输出为:16:14:19.070
。有人知道如何使用它吗?我希望收到类似 11:14 AM
.
另外,我试过使用这个:
final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
final DateTime time = formatter.parseDateTime(text);
Timber.i(time.toString()); // output: 2018-04-05T16:14:19.490-05:00
好像有5个小时的时差?有人知道我如何使用它来转换为本地时间吗?
使用此方法将您的时间转换为本地时间:
public static String convertTimeToLocal(String dateStr) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = format.parse(dateStr);
System.out.println(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String timeZone = Calendar.getInstance().getTimeZone().getID();
Date local = new Date(date.getTime() + TimeZone.getTimeZone(timeZone).getOffset(date.getTime()));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
String reportDate = df.format(local);
return reportDate;
}
& 对于上午和下午,使用此方法:
public static String convertTimeToAmPm(String time) {
List<String> arr = Arrays.asList(time.split(":"));
int hours = Integer.parseInt(arr.get(0));
int mins = Integer.parseInt(arr.get(1));
String timeSet = "";
if (hours > 12) {
hours -= 12;
timeSet = "PM";
} else if (hours == 0) {
hours += 12;
timeSet = "AM";
} else if (hours == 12)
timeSet = "PM";
else
timeSet = "AM";
String minutes = "";
if (mins < 10)
minutes = "0" + mins;
else
minutes = String.valueOf(mins);
// Append in a StringBuilder
String aTime = new StringBuilder().append(hours).append(':')
.append(minutes).append(" ").append(timeSet).toString();
return aTime;
}
最后的"Z"就是date/time is in UTC。如果将它放在引号内,它会被视为文字(字母 "Z" 本身)并且它失去了这种特殊含义 - 你基本上丢弃了它在 UTC 中的信息,并且 DateTime
假设JVM 默认时区(这就是为什么您的第二次尝试在 UTC-05:00 中导致 16:14)。
DateTime
可以直接解析这个输入:
String input = "2018-04-05T16:14:19.130Z";
DateTime dt = DateTime.parse(input);
然后将其转换为所需的时区。你可以这样做:
dt = dt.withZone(DateTimeZone.getDefault());
这将使用您的 JVM 的默认时区。但这并不是那么可靠,因为默认值可以在运行时更改 - 即使是同一 JVM 中的其他应用程序 运行 - 所以最好使用明确的时区:
dt = dt.withZone(DateTimeZone.forID("America/Chicago"));
然后就可以转换成你想要的格式了:
String time = dt.toString("hh:mm a"); // 11:14 AM
如果需要使用格式化程序,可以去掉"Z"两边的引号,同时在格式化程序中设置时区:
DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
// zone to be used for the formatter
.withZone(DateTimeZone.forID("America/Chicago"));
DateTime dateTime = parser.parseDateTime("2018-04-05T16:14:19.130Z");
String time = dateTime.toString("hh:mm a"); // 11:14 AM