我正在呼叫接受Date的Rest Web服务。在客户端,我已经使用JDK 8 OffsetDateTime类调用此服务。
Value that is going from my client side : 2018-07-01T05:30+05:30
Value that is accepted by Service : 2018-07-01T08:00:00.000+0000
下面是代码:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(ZoneId.of("UTC")));
cal.set(2018, 05, 31);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.HOUR_OF_DAY, 0);
OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(cal.getTime().toInstant(), ZoneId.systemDefault());
上面的代码附带的offsetDateTime的值为2018-07-01T05:30 + 05:30。
我在IST时区。 有人可以帮忙将日期更改为2018-07-01T08:00:00.000 + 0000时需要做什么。
答案 0 :(得分:2)
如果您想在世界标准时间7月1日上午8点…
OffsetDateTime.of(
2018 , 7 , 1 , // Date (year, month 1-12 is Jan-Dec, day-of-month)
8 , 0 , 0 , 0 , // Time (hour, minute, second, nano)
ZoneOffset.UTC // Offset-from-UTC (0 = UTC)
) // Returns a `OffsetDateTime` object.
.format( // Generates a `String` object with text representing the value of the `OffsetDateTime` object.
DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSZ" , Locale.US )
) // Returns a `String` object.
2018-07-01T08:00:00.000 + 0000
请勿使用Calendar
或Date
类。它们被现代的 java.time 类(例如OffsetDateTime
)完全取代。您正在将遗留类与现代类混合在一起,这没有任何意义。
您的问题不清楚您的投入是什么,什么是产出与期望的对比。
如果您的目标是在UTC于7月1日上午8点:
LocalDate ld = LocalDate.of( 2018 , Month.JULY , 1 ) ;
LocalTime lt = LocalTime.of( 8 , 0 ) ;
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
odt.toString():2018-07-01T08:00Z
该字符串格式符合ISO 8061标准。如果您的目的地拒绝该输入并仅接受2018-07-01T08:00:00.000+0000
,那么我们必须定义一种格式设置模式。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSZ" , Locale.US );
String output = odt.format( f );
2018-07-01T08:00:00.000 + 0000
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:1)
我认为下面的代码可以工作
public static Date ConvertToGMT() {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date utc = new Date(dateFormat.format(date));
return utc;
}
答案 2 :(得分:1)
您可以这样做
public static List<participant> participantList(int _id) => bL.asset.participants.eventrecord.List(_id, ref _em);
更新
如果您需要这里的 public static void Report(List<object> _args, ref report item, ref DataTable dtReport)
{
object[] _params = new object[_args.Count];
MethodInfo _method = typeof(reportmethods).GetMethod(item.methodname);
Type _t = _method.ReturnType;
if (item.reportvariables != null)
{
if (item.reportvariables.Count > 0)
{
int x = 0;
foreach (reportvariable current in item.reportvariables)
{
_params[x] = _args[x];
x++;
}
object result = _method.Invoke(null, _params);
//List<_t.GetType()> _tls = new List<_t.GetType()>();
if (result is IList && result.GetType().IsGenericType)
{
}
}
}
else
{ object result = _method.Invoke(null, null); }
}
实例。
offsetDateTime.atZoneSameInstant(ZoneId.of("Asia/Kolkata"))
答案 3 :(得分:0)
这不是您要的答案,但最终可能是您更喜欢的答案:再次检查您正在调用的服务是否接受您已经提供的格式。两种格式均符合ISO 8601,因此该服务似乎接受此标准格式。如果是这样,它也应该接受您的。
在任何情况下,都应单独使用OffsetDateTime
和java.time中的其他类,并避免使用旧的和过时的Calendar
和TimeZone
类。罗勒·布尔克(Basil Bourque)的答案显示了很好的解决方案。