前言
要利用Groovy脚本处理 Jira中 Date Picker 类型字段值。涉及到了类型解析转换的问题。特此总结记录一下各种转换方法。
Groovy的 - 转换时间戳字符串大纪元时间(毫秒)
import java.time.*
// build time as string
def build_time='2017-11-20T21:27:03Z'
log.warn("build_time:${build_time}")
// parse and get epoch
def time=Date.parse("yyyy-MM-dd'T'HH:mm:ss'Z'", build_time)
log.warn("time:${time}")
// get epoch milis:"获取纪元milis"
def epoch_milis = time.getTime()
log.warn("epoch_milis:${epoch_milis}")
// create UTC local time
def local_dt = LocalDateTime.ofInstant(Instant.ofEpochMilli(epoch_milis), ZoneId.of('UTC'));
log.warn("local_dt:${local_dt}")
// created zoned time out of UTC time
def zoned_dt = local_dt.atZone(ZoneId.of('America/Los_Angeles'))
log.warn("zoned_dt:${zoned_dt}")
// get offset in milis:以毫米为单位获取偏移量
def offset_ms = zoned_dt.getOffset().getTotalSeconds() * 1000
log.warn("offset_ms:${offset_ms}")
// add to UTC epoc
def local_timestamp = epoch_milis + offset_ms
log.warn("local_timestamp: ${local_timestamp}")
println "Time is ${local_timestamp}"
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.fields.CustomField
import java.sql.Timestamp
def customFieldManager = ComponentAccessor.getCustomFieldManager()
final customFieldName = '测试完成时间(实际)'
// the value of the new option to set
final newValue = 'Option C'
// the issue key to update
final issueKey = 'TEST-17643'
def issue = ComponentAccessor.issueManager.getIssueByCurrentKey(issueKey)
assert issue: "Could not find issue with key $issueKey"
def customField = ComponentAccessor.customFieldManager.getCustomFieldObjects(issue).findByName(customFieldName)
assert customField: "Could not find custom field with name $customFieldName"
CustomField destField = customFieldManager?.getCustomFieldObjectsByName(customFieldName)?.first()
def dateValue = issue.getCustomFieldValue(destField)
log.warn("dateValue:${dateValue}")
//转换字符串到jira中DatePicker类型字段
def stringTotimestamp = {String wantedDate ->
def date = Date.parse('yyyy-MM-dd HH:mm:ss.S', wantedDate)
log.warn("date:${date}")
def dategetTime = date.getTime()
log.warn("dategetTime:${dategetTime}")
return new Timestamp(date.getTime())
}
//newValue for datePicker customField
final wantedDateAsStr = '2022-08-15 00:00:00.0'
def wantedDate = stringTotimestamp(wantedDateAsStr)
log.warn("wantedDate:${wantedDate}")
2023-02-02 17:19:42,909 WARN [runner.ScriptBindingsManager]: build_time:2017-11-20T21:27:03Z
2023-02-02 17:19:42,910 WARN [runner.ScriptBindingsManager]: time:Mon Nov 20 21:27:03 CST 2017
2023-02-02 17:19:42,911 WARN [runner.ScriptBindingsManager]: epoch_milis:1511184423000
2023-02-02 17:19:42,942 WARN [runner.ScriptBindingsManager]: local_dt:2017-11-20T13:27:03
2023-02-02 17:19:42,948 WARN [runner.ScriptBindingsManager]: zoned_dt:2017-11-20T13:27:03-08:00[America/Los_Angeles]
2023-02-02 17:19:42,972 WARN [runner.ScriptBindingsManager]: offset_ms:-28800000
2023-02-02 17:19:42,972 WARN [runner.ScriptBindingsManager]: local_timestamp: 1511155623000
JAVA中java.util.Date、java.sql.Timestamp和String之间的互相转换
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
* 关于java.util.Date、java.sql.Timestamp和String之间的互相转换的方法
*
*/
public class DateUtil {
/**
* 将 String字符串————》java.util.Date格式日期
*
* @param strDate
* 表示日期的字符串
* @param dateFormat
* 传入字符串的日期表示格式(如:"yyyy-MM-dd HH:mm:ss")
* @return java.util.Date类型日期对象(如果转换失败则返回null)
*/
public static java.util.Date strToUtilDate(String strDate, String dateFormat) {
SimpleDateFormat sf = new SimpleDateFormat(dateFormat);
java.util.Date date = null;
try {
date = sf.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
/**
* 将String字符串————》java.sql.Timestamp格式日期,用于数据库保存
*
* @param strDate
* 表示日期的字符串
* @param dateFormat
* 传入字符串的日期表示格式(如:"yyyy-MM-dd HH:mm:ss")
* @return java.sql.Timestamp类型日期对象(如果转换失败则返回null)
*/
public static java.sql.Timestamp strToSqlDate(String strDate, String dateFormat) {
SimpleDateFormat sf = new SimpleDateFormat(dateFormat);
java.util.Date date = null;
try {
date = sf.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
java.sql.Timestamp dateSQL = new java.sql.Timestamp(date.getTime());
return dateSQL;
}
/**
* 将java.util.Date对象 ————》String字符串
*
* @param date
* 要格式的java.util.Date对象
* @param strFormat
* 输出的String字符串格式的限定(如:"yyyy-MM-dd HH:mm:ss")
* @return 表示日期的字符串
*/
public static String dateToStr(java.util.Date date, String strFormat) {
SimpleDateFormat sf = new SimpleDateFormat(strFormat);
String str = sf.format(date);
return str;
}
/**
* 将java.sql.Timestamp对象 ————》 String字符串
*
* @param time
* 要格式的java.sql.Timestamp对象
* @param strFormat
* 输出的String字符串格式的限定(如:"yyyy-MM-dd HH:mm:ss")
* @return 表示日期的字符串
*/
public static String dateToStr(java.sql.Timestamp time, String strFormat) {
DateFormat df = new SimpleDateFormat(strFormat);
String str = df.format(time);
return str;
}
/**
* 将java.sql.Timestamp对象 ————》 java.util.Date对象
*
* @param time
* 要转化的java.sql.Timestamp对象
* @return 转化后的java.util.Date对象
*/
public static java.util.Date timeToDate(java.sql.Timestamp time) {
return time;
}
/**
* 将java.util.Date对象 ————》java.sql.Timestamp对象
*
* @param date
* 要转化的java.util.Date对象
* @return 转化后的java.sql.Timestamp对象
*/
public static java.sql.Timestamp dateToTime(java.util.Date date) {
String strDate = dateToStr(date, "yyyy-MM-dd HH:mm:ss SSS");
return strToSqlDate(strDate, "yyyy-MM-dd HH:mm:ss SSS");
}
/**
* 返回表示系统当前时间的java.util.Date对象
* @return 返回表示系统当前时间的java.util.Date对象
*/
public static java.util.Date nowDate(){
return new java.util.Date();
}
/**
* 返回表示系统当前时间的java.sql.Timestamp对象
* @return 返回表示系统当前时间的java.sql.Timestamp对象
*/
public static java.sql.Timestamp nowTime(){
return dateToTime(new java.util.Date());
}
}