我在日期逻辑方面遇到了一些问题,我已将其与 JSON 序列化程序 Jackson 隔离。
在数据库和应用程序的调试点中,日期是正确的,并且所有内容都使用默认时区编写。但是,在序列化中增加了 4 个小时。我发现这可以通过专门告诉 Jackson 使用 EST(默认为 UTC)来解决。如下:
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss.SSSZ", timezone="America/New_York")
private Date startDate;
Run Code Online (Sandbox Code Playgroud)
但是,问题是只有本地使用 EST,而服务器将使用 UTC。我需要杰克逊使用系统默认值。
@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss.SSSZ", timezone=JsonFormat.DEFAULT_TIMEZONE)
private Date startDate;
Run Code Online (Sandbox Code Playgroud)
然而,它不起作用!我也尝试过timezone='DEFAULT_TIMEZONE'其他各种方法,但在所有情况下,api 输出似乎仍然比数据库中的数字早 4 小时。
我尝试过的其他事情:
JsonFormat.DEFAULT_TIMEZONE返回##default。TimeZone.getDefault().getDisplayName()返回Eastern Standard Time。杰克逊版本是 2.9。
有什么建议?
似乎新的java.timeAPI提供了所有内容java.util.Date以及更多内容.自Java 8以来新的API出现时
是否有任何理由使用?应和完全避免?java.util.Datejava.timejava.util.Datejava.util.Calendar
我的应用程序严重依赖于Java.我们做了大量的日志记录,数据库插入等.在白天的灯光定时开关之后,我们注意到所有的Java时间都落后了大约一个小时.我们的版本是1.6_18.我认为这个问题在早期版本的Java中得到了解决.如果有任何补丁,请建议可以做什么.
我需要转换GMT为亚利桑那州时间。亚利桑那州目前已MST关闭夏令时。
然而在 Joda TimeDateTimeZone代码中,MST已映射到America/Denver:
map.put("MST", "America/Denver");
Run Code Online (Sandbox Code Playgroud)
可以看出,目前丹佛实行夏令时,因此有MDT。DateTimeZone那么为什么要在代码中进行这样的映射呢?
在从 转换为亚利桑那州本地时区时GMT,我得到了偏移量,因为GMT-6这是错误的,而且应该是这样GMT-7,因为MST没有夏令时。
这是一个错误吗?如何解决问题?
我正在尝试将电子邮件(日期对象)的接收日期与 JSONObject 中的日期(字符串)进行比较。这两个日期将属于不同时区,相差 1 小时。
我的情况是,我必须在几秒钟内获得它们之间的确切差异,如果差异为 +/- 10 秒,我就会找到匹配项。为此,我决定将两者都转换为“UTC”,然后进行区别。这是我的代码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String MsgDtStr = sdf.format(messagesToBeProcessed.getReceivedDate());
Date MsgDt = sdf.parse(MsgDtStr);
Date ObjDt = sdf.parse((JsonObj.get("date").toString()));
int DiffInSecs = (int) (ObjDt.getTime() - MsgDt.getTime()) / 1000 % 60;
if (DiffInSecs >= -10 && DiffInSecs <= 10) {
System.out.println("Found a match!");
MatchedList.add(i);
}
Run Code Online (Sandbox Code Playgroud)
这似乎给了我正确的结果。应该与 json 对象匹配的邮件匹配。即差异为 +/- 10 秒。但是,当我尝试打印日期并DiffInSecs在上述逻辑之后,我得到如下值:
date in object: 2017-06-22 19:47:25
date in message: 2017-06-22 23:47:30
DiffInSecs: -5
........
date in object: 2017-06-22 17:50:38
date …Run Code Online (Sandbox Code Playgroud) 我有来自服务器的转换时间的问题,我想将其转换为24小时.我正在使用以下代码:
String timeComeFromServer = "3:30 PM";
SimpleDateFormat date12Format = new SimpleDateFormat("hh:mm a");
SimpleDateFormat date24Format = new SimpleDateFormat("HH:mm");
try {
((TextView)findViewById(R.id.ahmad)).setText(date24Format.format(date12Format.parse(timeComeFromServer)));
} catch (ParseException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
有错误:
方法抛出'java.text.ParseException'异常.)
详细的错误消息是:
无法解释的日期:"下午3:30"(偏移5)
但是,如果我更换PM到p.m.它的工作原理没有任何这样的问题:
timeComeFromServer = timeComeFromServer.replaceAll("PM", "p.m.").replaceAll("AM", "a.m.");
Run Code Online (Sandbox Code Playgroud)
谁能告诉我哪种方法正确?
我的日期为String,但有时它没有有效的日期或月份(值为零,00)。
例子:
String value = "03082017";
Run Code Online (Sandbox Code Playgroud)
然后我这样做:
String day = value.substring(0,2);
String month = value.substring(2,4);
String year = value.substring(4,8);
if(day.equals("00")) {
day = "01";
}
if(month.equals("00")) {
month = "01";
}
value = day + month + year;
Run Code Online (Sandbox Code Playgroud)
这适用于示例String。
现在我有这个字符串:
String value = "00092017" //ddMMyyyy
Run Code Online (Sandbox Code Playgroud)
然后我的代码将00日期转换为01.
这适用于模式ddMMyyyy,但现在是我的问题:我可以有不同的模式:ddMMyyyy或MMddyyyy或yyyy/dd/MM等
我的解决方案是首先检查模式(例如MMddyyyy),然后查看我的值03092017(ddMMyyyy)并将数字放入我的日期字符串中,该字符串位于模式中的 dd 位置。
所以代码有模式ddMMyyyy但值为03092017( MMddyyyy …
作为输入,我有一个字符串,它是 ISO 8601 中的字符串,用于表示日期。例如:
“2017-04-04T09:00:00-08:00”
String的最后一部分“-08:00”表示时区偏移。我将此字符串转换为Calendar实例,如下所示:
Calendar calendar = GregorianCalendar.getInstance();
Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US).parse(iso8601Date);
calendar.setTime(date);
Run Code Online (Sandbox Code Playgroud)
iso8601日期为“2017-04-04T09:00:00-08:00”
但这不会选择时区,如果我从Calendar实例获取时区,它会给出笔记本电脑当前设置的实例,并且不会从 ISO 8601 字符串中获取时间戳。我通过日历实例检查时区:
calendar.getTimeZone().getDisplayName()
Run Code Online (Sandbox Code Playgroud)
有人可以展示如何在Calendar实例中选择时区吗?
我正在开发一个应用程序,它从Google TimeZone API. 只是我有时间在地球上所需的地方以毫秒为单位。
例如:1504760156000它显示的是伦敦的日期时间
2017 年 9 月 7 日星期四 09:55:56
由于我在+05:00UTC 的时区,如果我操纵1504760156000这些毫秒,它将显示整个日期时间,如下所示:
2017 年 9 月 7 日星期四 09:55:56 GMT+0500(巴基斯坦标准时间)
但我想表明:
2017 年 9 月 7 日星期四 09:55:56 GMT+0100(英国夏令时间)
问题是:我有正确的伦敦日期和时间,但可以在不更改时间的情况下显示/更改时区,因为根据伦敦时间是正确的。
更新
得到一些评论后。在我的例子中,你没有把我带到这里。
假设我在巴基斯坦,时间在这里,1:55 PM所以我通过我的应用程序要求 GOOGLE API 告诉我伦敦的时间是什么时候。Google API 告诉我伦敦的时间是1504760156000(上午 9 点 55 分)以毫秒为单位,如果我将这些毫秒转换为Date对象,它将打印如下:
Date date =new Date(1504760156000)
Run Code Online (Sandbox Code Playgroud)
2017 年 9 月 7 日星期四 09:55:56 GMT+0500(巴基斯坦标准时间)
它会根据我的本地时区操作它,但我想要如下结果
2017 年 9 月 7 日星期四 09:55:56 …
我想以这种格式解析此日期 2021-11-03T14:09:31.135Z ( message.created_at)
我的代码是这样的:
val dateFormat = SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS")
var convertedDate = Date()
try {
convertedDate = dateFormat.parse(message.created_at)
} catch (e: ParseException) {
e.printStackTrace()
}
Run Code Online (Sandbox Code Playgroud)
解析失败