我需要将日期格式化为特定的字符串。
我使用SimpleDateFormat
类使用“ yyyy-MM-dd'T'HH:mm:ssZ
”模式格式化日期,它将当前日期作为
“2013-01-04T15:51:45+0530
”但我需要as
“2013-01-04T15:51:45+05:30
”。
以下是使用的编码,
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime()));
输出:格式化字符串:2013-01-04T15:51:45+0530
我需要格式为2013-01-04T15:51:45+05:30
,只需在gmt time之间添加冒号。
因为我正在Google日历上插入活动,所以它只接受我提到的所需格式。
答案 0 :(得分:29)
您也可以使用" ZZZZZ"而不是" Z"在你的模式中(根据documentation)。像这样的东西
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ", Locale.ENGLISH);
Log.e(C.TAG, "formatted string: "+sdf.format(c.getTime()));
答案 1 :(得分:12)
您可以改用Joda Time。其DateTimeFormat
具有ZZ
格式属性,可以满足您的需求。
大优势:与SimpleDateFormat
不同,DateTimeFormatter
是线程安全的。用法:
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ")
.withLocale(Locale.ENGLISH);
答案 2 :(得分:2)
您可以使用模式 yyyy-MM-dd'T'HH:mm:ssXXX
作为您想要的输出。
java.util
的日期时间 API 及其格式化 API SimpleDateFormat
已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API。
构建一个保存日期、时间和时区偏移信息并设置相同格式的对象:
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
OffsetDateTime odt = OffsetDateTime.of(LocalDate.of(2013, 1, 4), LocalTime.of(15, 51, 45),
ZoneOffset.ofHoursMinutes(5, 30));
// Print the default format i.e. the string returned by OffsetDateTime#toString
System.out.println(odt);
// Custom format
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
System.out.println(dtf.format(odt));
}
}
输出:
2013-01-04T15:51:45+05:30
2013-01-04T15:51:45+05:30
如您所见,默认格式的输出与使用 DateTimeFormatter
的输出相同。但是,这里有一个问题:OffsetDateTime#toString
省略 的实现会忽略秒和秒的分数,如果它们是 0
即如果上面代码中的时间是 {{ 1}},默认格式的输出将为 LocalTime.of(15, 0, 0)
。如果此时您需要像 2013-01-04T15:00+05:30
这样的字符串,则必须使用具有所需模式的 2013-01-04T15:00:00+05:30
。
解析和格式化:
DateTimeFormatter
输出:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
DateTimeFormatter dtfForInputString = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
OffsetDateTime odt = OffsetDateTime.parse("2013-01-04T15:51:45+0530", dtfForInputString);
// Print the default format i.e. the string returned by OffsetDateTime#toString
System.out.println(odt);
// Custom format
DateTimeFormatter dtfCustomOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
System.out.println(dtfCustomOutput.format(odt));
}
}
为给定的时区偏移量构建一个日期时间对象并设置相同的格式:
2013-01-04T15:51:45+05:30
2013-01-04T15:51:45+05:30
输出:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+05:30"));
calendar.set(2013, 0, 4, 15, 51, 45);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
Date date = calendar.getTime();
System.out.println(sdf.format(date));
}
}
2013-01-04T15:51:45+05:30
类使用 Calendar
(或 UTC
)作为其默认时区,因此,除非您指定时区,否则它将返回 GMT
对象java.util.Date
。
同样,UTC
类也使用 SimpleDateFormat
作为其默认时区,因此,除非您指定时区,否则它将返回相应日期时间的格式化 UTC
在String
。
解析和格式化:
UTC
输出:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdfForInputString = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
Date date = sdfForInputString.parse("2013-01-04T15:51:45+0530");
SimpleDateFormat sdfCustomOutput = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
sdfCustomOutput.setTimeZone(TimeZone.getTimeZone("GMT+05:30"));
System.out.println(sdfCustomOutput.format(date));
}
}
答案 3 :(得分:1)
你可以做的只是使用substring()手动添加“:”。我早些时候已经面对过这个问题了。
答案 4 :(得分:1)
试试这个
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH);
System.out.println("formatted string: "+sdf.format(c.getTime()));
String text = sdf.format(c.getTime());
String result = text.substring(0, 22) + ":" + text.substring(22);
System.out.println("result = " + result);
答案 5 :(得分:1)
为什么不用regexp手动执行?
String oldDate = "2013-01-04T15:51:45+0530";
String newDate = oldDate.replaceAll("(\\+\\d\\d)(\\d\\d)", "$1:$2");
相同的结果,带子串(如果性能有问题)。
String oldDate = "2013-01-04T15:51:45+0530";
int length = oldDate.length();
String newDate = oldDate.substring(0, length - 2) + ':' + oldDate.substring(length - 2);
答案 6 :(得分:0)
试试此代码
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z", Locale.ENGLISH);
String s = sdf.format(c.getTime());
String fDate = s.substring(0, s.length()-2) +":"+s.substring(s.length()-2, s.length());
Log.e("check", "formatted string: "+fDate);
答案 7 :(得分:0)
只需重构此代码并替换' Locale.getDefault()'使用您需要的区域设置
{{1}}
//这是用法
SimpleDateFormat sdf = getDateFormat();
sdf.format(new Date());
答案 8 :(得分:0)
如果您希望日期使用其他timeZone(标题提示)
val nowMillsUTC = System.currentTimeMillis()
val timeZoneID = "Australia/Perth"
val tz = TimeZone.getTimeZone(timeZoneID)
val simpleDateFormat = SimpleDateFormat("HH.mm dd.MMM.yyyy", Locale.getDefault())
simpleDateFormat.setTimeZone(tz)
val resultTxt = simpleDateFormat.format(nowMillsUTC)
print(timeZoneID + " -> " + resultTxt)
// Australia/Perth -> 19.59 21.Mar.2019
答案 9 :(得分:0)
这就是我在 android Build.VERSION.SDK_INT < 26
上的做法int offset = TimeZone.getDefault().getRawOffset();
String str_date='20:30 12-01-2021';
DateFormat formatter = new SimpleDateFormat("HH:mm dd-MM-yyy",Locale.US);
Date date = formatter.parse(str_date);
long utcTime = date.getTime() + (3600000*3);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd/MM/yyyy", Locale.US);
String dateStr = sdf.format(utcTime + offset);
System.out.println(dateStr);
当我的服务器发送带有 -3 时区的时间时,我必须将 (3600*3) 添加到 getTime 并将其保存到 utcTime 中,这样 utcTime 就是 UTC。然后我将手机当前时区的偏移量添加到 utcTime。 在我的情况下,因为我的时区是 -3 它的打印:
20:30 12/01/2021
但如果我更改时区,日期也会更改。
我已经在这里回答了: Convert UTC into Local Time on Android