在Groovy中将毫秒时间转换为日期格式(YYYY-MM-DD)

3

在Groovy中,有没有将毫秒级时间转换为日期格式(YYYY-MM-DD)的函数?

我有一个Groovy脚本需要进行以下日期值的比较:

for(i in order_lineitems) 
{
   if(i.startDate==order_submit_date)
   {
        matchedIds1 += i.salesOrderLineitemId+','; 
   }
}

在这里,i.startDate 是以日期格式yyyy-mm-dd毫秒时间,而order_submit_date是以日期格式yyyy-MM-dd HH:mm:ss毫秒时间。我需要在if块内将order_submit_date转换为yyyy-mm-dd格式。
我不熟悉Groovy脚本,需要帮助。
我的代码有一个小错误,现已更正。if块应该如下所示:if (i.startDate == order_submit_date),两个值都是以毫秒表示的长整型。
现在我需要确保条件正确,即开始日期等于订单提交日期。
这里发生的情况是: i.startDate的值为1452105000000(Thu Jan 07 2016 00:00:00),当创建销售订单时存储在数据库中; order_submit_date的值为1452158393097(Thu Jan 07 2016 14:49:53),当用户在UI中提交销售订单进行审核时生成。 由于order_submit_date包含日期和时间,因此长整型值不同,我无法满足条件。
因此,我有一个问题,是否有一个函数在Groovy中,可以将我的order_submit_date长整型值转换为日期(yyyy-mm-dd)格式,然后比较两个值以满足if块的条件。

i.startDateorder_submit_date的类型是什么? - Shashank Agrawal
@ShashankAgrawal 对于不太清晰的问题我表示抱歉。 我已经更新了我的问题,请参考一下。这两个字段都有很长的值。 - Nitin Vegi
3个回答

1
您可以像这样比较您的毫秒级日期:
请注意,解决方案取决于时区。
Groovy选项:
def compare(def m1, def m2) {
  def dateInMillis1 = new Date(m1)
  def dateInMillis2 = new Date(m2)
  dateInMillis1.clearTime() == dateInMillis2.clearTime()
}

Java选项1:

boolean compare1(long millis1, long millis2) {
    Date dateFromMillis = new Date(millis1);
    Date dateFromMillis2 = new Date(millis2);
    SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD");
    sdf.format(dateFromMillis).equals(sdf.format(dateFromMillis2));
}

或者您可以使用日历:

Java选项2:

boolean compare2(long m1, long m2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTimeInMillis(m1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTimeInMillis(m2);
    return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) &&
            calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH) &&
            calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
}

0

i.startDateorder_submit_date的类型是java.util.Date还是String?
你想使用i.startDateorder_submit_date来做比较吗?

-- 更新 --

好的,那么可能像下面这样:

import java.text.SimpleDateFormat

String startDate = "2016-01-20"
String order_submit_date = "2016-01-20 12:34:56"

SimpleDateFormat formatDateWithTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd")

if (formatDate.parse(startDate) >= formatDateWithTime.parse(order_submit_date)) {
    println "hehe"
} else {
    println "hoho"
}

SimpleDateFormat#parse() 方法返回 java.util.Date
你也可以与以下内容进行比较。

你也可以写成如下形式!

import java.text.SimpleDateFormat
SimpleDateFormat formatDateWithTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd")

def matchedIds1 = order_lineitems.findAll {
    formatDate.parse(it.startDate) >= formatDateWithTime.parse(order_submit_date)
}.join(",")

长(类型)版本

def matchedIds1 = order_lineitems.findAll {
   new Date(it.startDate).clearTime() == new Date(order_submit_date).clearTime()
}.join(",")

没有清除时间版本的Long(type)

String format = "yyyy-MM-dd 00:00:00"
SimpleDateFormat fillByZero = new SimpleDateFormat(format)

def matchedIds1 = order_lineitems.findAll {
   Date a = new Date(it.startDate)
   Date b = new Date(order_submit_date)
   fillByZero.parse(a.format(format)) == fillByZero.parse(b.format(format))
}.join(",")

返回类型是字符串。是的,我只想在这里使用i.startDate和order_submit_date进行比较。 - Nitin Vegi
抱歉问题不够清晰。 我已经更新了我的问题,请参考。这两个字段都有很长的值。 - Nitin Vegi
谢谢您的回答。 - Nitin Vegi
当我使用clearTime()函数时,我一直遇到这个错误:groovy.lang.MissingMethodException:No signature of method: java.util.Date.clearTime() is applicable for argument types: () values: {} - Nitin Vegi
嗨@Koji, 我找到了错误。 我的代码库使用的是较旧版本的Groovy,不支持.clearTime()函数。 - Nitin Vegi
显示剩余2条评论

0

你的问题不够清晰,无法确定你的日期是以字符串格式还是毫秒(long)格式呈现。

如果日期是以字符串格式呈现,例如“2015-10-31”

你可以使用SimpleDateFormat来处理。

import java.text.SimpleDateFormat
...


SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd")
SimpleDateFormat dateTimeParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

for (i in order_lineitems) {
   if (dateParser.parse(i.startDate) >= dateTimeParser.parse(order_submit_date)) {
        matchedIds1 += i.salesOrderLineitemId+','; 
   }
}

如果日期是以毫秒为单位的:

for (i in order_lineitems) {
   if (new Date(i.startDate.toString().toLong()) >= new Date(order_submit_date.toString().toLong())) {
        matchedIds1 += i.salesOrderLineitemId+','; 
   }
}

注意: 大写的Y和小写的y(同样适用于mh)在格式上有所不同,请明确使用。

问题的实际答案:

您不需要以上任何解决方案,而是可以简单地像下面这样在日期上使用clearTime()方法:

for (i in order_lineitems) {
   if (new Date(i.startDate) >= new Date(order_submit_date).clearTime()) {
        matchedIds1 += i.salesOrderLineitemId+','; 
   }
}

clearTime() 方法将从您的日期中简单地删除时间部分,即将 Thu Jan 07 2016 14:49:53 转换为 Thu Jan 07 2016 00:00:00


抱歉问题不够清晰。 我已经更新了我的问题,请参考它。 这两个字段都有很长的值。 - Nitin Vegi
这里有另一个问题要问关于“实际答案”。 由于我的值是long类型的。clearTime()函数是否会从long值中删除时间部分? 感谢@ShashankAgarwal的回答。 - Nitin Vegi
是的,那个长整型值实际上是EPOCH时间,即从1970年1月1日星期四开始的毫秒数,因此进行clearTime()操作将会重置当天的时间为00:00:00,因此时间部分将被删除。请阅读https://docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime()和https://en.wikipedia.org/wiki/Unix_time。 - Shashank Agrawal
当我使用clearTime()函数时,我一直遇到这个错误:groovy.lang.MissingMethodException:No signature of method: java.util.Date.clearTime() is applicable for argument types: () values: {} - Nitin Vegi
这个论坛上已经有一个问题发布了,但我无法找到清除错误的方法。[链接]https://dev59.com/_mHVa4cB1Zd3GeqPp8J- - Nitin Vegi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接