【问题标题】:Converting to SalesForce datetime format in Mule-3.8.4 using DataWeave 1.0使用 DataWeave 1.0 在 Mule-3.8.4 中转换为 SalesForce 日期时间格式
【发布时间】:2019-03-23 03:45:14
【问题描述】:

我正在尝试将 CSV 中的 datetime 列转换为 salesforce 日期时间格式以执行 upsert。我在 mule-3.8.4 dataweave1.0 中尝试了如下表达式,但出现错误。

我尝试了以下方法:

第一次尝试

Test_Date: "1/14/19 6:31 PM" as :localdatetime { format: "M/dd/yy h:mm a" } as :localdatetime { format: "YYYY-MM-DD'T'hh:mm:ssZ" })

预期产出:2019-01-14T06:31:00Z

实际输出:2019 年 1 月 14 日星期一 18:31:00 EST 2019

在 Salesforce 中进行 Upsert 之后,它看起来像这样:2019-01-14T00:00:00.000+0000。这并没有节省时间。


第二次尝试

Test_Date: "1/14/19 6:31 PM" as :localdatetime { format: "M/dd/yy h:mm a" } as :localdatetime { format: "YYYY-MM-DD'T'hh:mm:ss" })

预期产出:2019-01-14T06:31:00

实际输出:2019 年 1 月 14 日星期一 18:31:00 EST 2019

在 Salesforce 中进行 Upsert 之后,它看起来像这样:2019-01-14T00:00:00.000+0000。它仍然没有节省时间。

有什么问题?

【问题讨论】:

    标签: java salesforce mule dataweave


    【解决方案1】:

    要格式化日期,从左到右读取的格式模式需要与您的预期输出相匹配。所以对于你的例子:

    2019-01-14T06:31:00Z

    yyyy-MM-dd'T'HH:mm:ssZ

    y 代表年份 M 代表月份(小写 m 代表分钟

    d 代表一天

    H 是 24 小时制的小时。 (小写将是 12 格式)

    S 是毫秒

    Z 是时区 如果需要,您可以为时区和毫秒配置更多内容。

    以下是 salesforce 日期格式信息:

    https://developer.salesforce.com/docs/atlas.en-us.api_asynch.meta/api_asynch/datafiles_date_format.htm

    更多日期格式信息:

    https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

    【讨论】:

    • Test_Date: "1/22/19 6:31 PM" as :localdatetime { format: "M/dd/yy h:mm a" } as :localdatetime { format: "yyyy-MM- dd'T'HH:mm:ssZ" }) 。尝试了您建议的更改,但在 salesforce 中完成 upsert 时仍然没有附加小时和分钟。在 Upsert 结果之后:2019-01-22T00:00:00.000+0000。出于某种原因,Salesforce 仅更新日期部分并将 00 附加到小时、分钟和秒。再次感谢。
    【解决方案2】:

    您是否尝试将其作为 String 发送到 Salesforce?一旦某个东西的类型是LocalDateTime,就没有进一步的格式化了。格式化仅用于将String 解析为LocalDateTime 或将LocalDateTime 的输出格式化为String。例如:

    "1/14/19 6:31 PM" 
      as :localdatetime { format: "M/dd/yy h:mm a" }         // This parses the string as LocalDateTime
      as :localdatetime { format: "YYYY-MM-DD'T'hh:mm:ssZ" } // This doesn't do anything, it's already LocalDateTime
    

    如果您想使用一个代表日期时间的String 并将其格式化为代表同一日期时间的另一个String,您可以这样做:

    ...
    %var inputFormat  = "M/dd/yy h:mm a"
    %var outputFormat = "yyyy-MM-dd'T'HH:mm:ss"
    ---
    "1/14/19 6:31 PM" 
      as :localdatetime { format: inputFormat  } // Used to parse the input string
      as :string        { format: outputFormat } // Used to format the output string
    

    最后一个脚本的输出应该是"2019-01-14T18:31:00"

    【讨论】:

    • 当我尝试将其作为字符串发送到 Salesforce 时?它在 DataWeave 步骤中的转换消息中失败,并出现以下错误。 Test_Date: "1/22/19 6:31 PM" as :localdatetime { format: "M/dd/yy h:mm a" } as :string { format: "yyyy-MM-dd'T'HH:mm: ss.SSSZ" }) 无法将 :localdatetime 强制转换为 :string,原因是 :Unsupported field: OffsetSeconds.
    • 对,我相信这是因为LocalDateTime 没有时区。 docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html "这个类不存储也不代表时区。"
    • 如果您将Z 去掉格式可能会成功,但我已经有一段时间没有与 Salesforce 集成了。
    【解决方案3】:

    下面的代码终于奏效了。 Mule Dataweave 将以下格式(yyyy-MM-dd'T'HH:mm:ss.SSSZ)转换为 java.util.Calendar 对象。

    Test_Date: "1/22/19 6:31 PM" as :localdatetime { format: "M/dd/yy h:mm a" } as :datetime { format: "yyyy-MM-dd'T'HH :mm:ss.SSSZ" })

    这是 Payload 在 DataWeave 中处理转换消息的方式(上一步):

    Test_Date=java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0 ,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=0,WEEK_OF_YEAR=13,WEEK_OF_MONTH=5,DAY_OF_MONTH=22,DAY_OF_YEAR=84, DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=4,HOUR_OF_DAY=18,MINUTE=31,SECOND=0,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]

    在销售队伍中更新后的输出:2019-01-22T18:31:00.000+0000

    【讨论】:

    • 您能帮我理解一下:如何将其转换为 LocalDateTime 使其成为 Salesforce 期望的 java.util.Calendar?
    猜你喜欢
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多