将日期转换为设备本地时区的字符串。

huangapple go评论77阅读模式
英文:

Change Date to a string on the local time zone of the device

问题

我从数据库中获取到一个 Date 数据类型,格式如 Mon Sep 14 11:30:00 GMT+03:00 2020。我想将这个值转换为字符串,所以我使用了以下函数。

public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm";

public static String dateToString(Date date){
    DateFormat dateFormat = new SimpleDateFormat(General.DATE_FORMAT);
    dateFormat.setTimeZone(TimeZone.getDefault());
    if(date == null)
        return "";
    return dateFormat.format(date);
}

这个函数给我返回了这个输出 2020-09-14 11:30,但根据我的 Android 设备时区,应该是 2020-09-14 02:30。有什么建议吗?

英文:

I am getting a Date datatype from the database like this Mon Sep 14 11:30:00 GMT+03:00 2020.I want to change this value to a string so I used this function.

public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm";


public static String dateToString(Date date){
    DateFormat dateFormat = new SimpleDateFormat(General.DATE_FORMAT);
    dateFormat.setTimeZone(TimeZone.getDefault());
    if(date == null)
        return "";
    return dateFormat.format(date);
}

This function is given me this output 2020-09-14 11:30 but it should be 2020-09-14 02:30 according to my android device time zone. Any suggestions ?

答案1

得分: 1

你可以使用 java.time 来实现这个功能,现在通过 Android API Desugaring 已经可以在较低的 Android API 版本上使用。

public static void main(String[] args) {
	// (几乎) 您的输出示例模式 (在这里使用 u 更好)
	final String DATE_FORMAT = "uuuu-MM-dd HH:mm";
	// 使用它创建输出格式化器
	DateTimeFormatter outputDtf = DateTimeFormatter.ofPattern(DATE_FORMAT);
	// 您的示例字符串
	String exampleDate = "Mon Sep 14 11:30:00 GMT+03:00 2020";
	// 使用特定模式和名称的 Locale 来解析它
	DateTimeFormatter parserDtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss O uuuu",
																Locale.ENGLISH);
	// 然后解析示例字符串
	OffsetDateTime odt = OffsetDateTime.parse(exampleDate, parserDtf);
	// 获取您的本地偏移量 (设备的偏移量)
	ZoneOffset localOffset = OffsetDateTime.now().getOffset();
	// 调整偏移量为本地偏移量
	OffsetDateTime localOdt = odt.withOffsetSameInstant(localOffset);
	// 输出它 (在 Android 上,请使用日志...)
	System.out.println(odt.format(outputDtf));	// 示例日期时间
	System.out.println(localOdt.format(outputDtf));	// 本地偏移量下的相同时间
}

此代码输出:

2020-09-14 11:30
2020-09-14 10:30

请注意,输出已经考虑了我的当前偏移量,即 UTC+02:00。

英文:

You could use java.time for this, it is made available to lower Android API levels via Android API Desugaring now.

public static void main(String[] args) {
	// (nearly) your example pattern for output (u is better here)
	final String DATE_FORMAT = "uuuu-MM-dd HH:mm";
	// use it to create an output formatter
	DateTimeFormatter outputDtf = DateTimeFormatter.ofPattern(DATE_FORMAT);
	// your example String
	String exampleDate = "Mon Sep 14 11:30:00 GMT+03:00 2020";
	// parse it with a suitable formatter using a specific pattern and a Locale for names
	DateTimeFormatter parserDtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss O uuuu",
																Locale.ENGLISH);
	// then parse the example String
	OffsetDateTime odt = OffsetDateTime.parse(exampleDate, parserDtf);
	// get your local offset (the one of your device)
	ZoneOffset localOffset = OffsetDateTime.now().getOffset();
	// and adjust the offset to your local one
	OffsetDateTime localOdt = odt.withOffsetSameInstant(localOffset);
	// and output it (on android, use log...)
	System.out.println(odt.format(outputDtf));	// example datetime
	System.out.println(localOdt.format(outputDtf));	// same time in local offset
}

This code outputs

2020-09-14 11:30
2020-09-14 10:30

Please note that the output has — of course — taken my current offset, which is UTC+02:00.

答案2

得分: 1

尝试使用 LocalegetDefault() 方法

public static String dateToString(Date date){
    DateFormat dateFormat = new SimpleDateFormat(General.DATE_FORMAT, Locale.getDefault());
    dateFormat.setTimeZone(TimeZone.getDefault());
    if(date == null)
        return "";
    return dateFormat.format(date);
}

希望这对您有帮助。谢谢。

英文:

Try out the getDefault() method of Locale

public static String dateToString(Date date){
    DateFormat dateFormat = new SimpleDateFormat(General.DATE_FORMAT, Locale.getDefault());
    dateFormat.setTimeZone(TimeZone.getDefault());
    if(date == null)
        return "";
    return dateFormat.format(date);
}

Hope it will work for you. Thank you.

答案3

得分: 0

尝试在之前设置它

TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
英文:

Try set it before

TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

huangapple
  • 本文由 发表于 2020年9月15日 15:31:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/63897101.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定