1# 使用JSVM-API接口进行Date相关开发 2 3## 简介 4 5JSVM-API中date相关接口用于处理JavaScript Date对象,并在JSVM模块和JavaScript代码之间进行日期数据的转换和处理。这对于在JSVM模块中处理时间和日期相关逻辑非常有用。 6 7## 基本概念 8 9在JSVM-API中,JavaScript Date对象的数据表示从UTC时间1970年1月1日0时0分0秒起至现在的总毫秒数。 10 11JavaScript Date对象提供了一种在JavaScript中表示和操作日期和时间的方式。它们允许您创建表示特定时刻的日期对象,执行各种日期和时间相关的计算(如添加或减去时间间隔),以及格式化日期为字符串以供显示。 12 13在JSVM-API中,通过提供与Date对象交互的函数,JSVM模块能够更紧密地与JavaScript环境集成,执行更复杂的日期和时间相关操作。 14 15## 接口说明 16 17| 接口 | 功能说明 | 18|----------------------------|--------------------------------| 19| OH_JSVM_CreateDate | 创建了一个表示给定毫秒数的Date对象。 | 20| OH_JSVM_GetDateValue | 获取给定JavaScript Date的时间值的Double基础类型值。 | 21| OH_JSVM_IsDate | 判断一个JavaScript对象是否为Date类型对象。| 22 23## 使用示例 24 25JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md),本文仅对接口对应C++相关代码进行展示。 26 27### OH_JSVM_CreateDate 28 29创建一个表示给定毫秒数的Date对象。 30 31cpp部分代码 32 33```cpp 34#include <time.h> 35// OH_JSVM_CreateDate的样例方法 36static JSVM_Value CreateDate(JSVM_Env env, JSVM_CallbackInfo info) { 37 // 通过c接口获取Unix纪元以来经过的秒数,并转化为毫秒数为单位 38 double value = static_cast<double>(time(NULL) * 1000); 39 // 调用OH_JSVM_CreateDate接口将double值转换成表示日期时间的JavaScript值返回出去 40 JSVM_Value returnValue = nullptr; 41 42 JSVM_CALL(OH_JSVM_CreateDate(env, value, &returnValue)); 43 44 bool isDate; 45 JSVM_CALL(OH_JSVM_IsDate(env, returnValue, &isDate)); 46 if (isDate == false) { 47 OH_LOG_ERROR(LOG_APP, "JSVM IsDate fail"); 48 return returnValue; 49 } 50 51 value = 0; 52 JSVM_CALL(OH_JSVM_GetDateValue(env, returnValue, &value)); 53 54 uint64_t time = static_cast<uint64_t>(value) / 1000; 55 char *date = ctime(reinterpret_cast<time_t *>(&time)); 56 OH_LOG_INFO(LOG_APP, "JSVM CreateDate success:%{public}s", date); 57 58 return returnValue; 59} 60 61// CreateDate注册回调 62static JSVM_CallbackStruct param[] = { 63 {.data = nullptr, .callback = CreateDate}, 64}; 65static JSVM_CallbackStruct *method = param; 66// CreateDate方法别名,供JS调用 67static JSVM_PropertyDescriptor descriptor[] = { 68 {"createDate", nullptr, method, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 69}; 70// 样例测试js 71const char *srcCallNative = R"JS(createDate())JS"; 72``` 73 74### OH_JSVM_GetDateValue 75 76获取给定JavaScript Date的时间值的Double基础类型值。 77 78cpp部分代码 79 80```cpp 81#include <time.h> 82// OH_JSVM_GetDateValue的样例方法 83static JSVM_Value GetDateValue(JSVM_Env env, JSVM_CallbackInfo info) { 84 size_t argc = 1; 85 JSVM_Value args[1] = {nullptr}; 86 JSVM_CALL(OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr)); 87 // 获取传入的Unix Time Stamp时间 88 double value; 89 JSVM_CALL(OH_JSVM_GetDateValue(env, args[0], &value)); 90 91 // 将获取到的Unix Time Stamp时间转化为日期字符串打印 92 uint64_t time = static_cast<uint64_t>(value) / 1000; 93 char *date = ctime(reinterpret_cast<time_t *>(&time)); 94 OH_LOG_INFO(LOG_APP, "JSVM GetDateValue success:%{public}s", date); 95 96 JSVM_Value returnValue = nullptr; 97 JSVM_CALL(OH_JSVM_CreateDouble(env, value, &returnValue)); 98 return returnValue; 99} 100 101// CreateDate注册回调 102static JSVM_CallbackStruct param[] = { 103 {.data = nullptr, .callback = GetDateValue}, 104}; 105static JSVM_CallbackStruct *method = param; 106// CreateDate方法别名,供JS调用 107static JSVM_PropertyDescriptor descriptor[] = { 108 {"getDateValue", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 109}; 110// 样例测试js 111const char *srcCallNative = R"JS(getDateValue(new Date(Date.now())))JS"; 112``` 113 114### OH_JSVM_IsDate 115 116判断一个JavaScript对象是否为Date类型对象。 117 118cpp部分代码 119 120```cpp 121// OH_JSVM_IsDate的样例方法 122static JSVM_Value IsDate(JSVM_Env env, JSVM_CallbackInfo info) { 123 size_t argc = 1; 124 JSVM_Value args[1] = {nullptr}; 125 JSVM_CALL(OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr)); 126 bool isData; 127 JSVM_CALL(OH_JSVM_IsDate(env, args[0], &isData)); 128 OH_LOG_INFO(LOG_APP, "JSVM IsDate success:%{public}d", isData); 129 130 JSVM_Value result = nullptr; 131 JSVM_CALL(OH_JSVM_GetBoolean(env, isData, &result)); 132 return result; 133} 134// CreateDate注册回调 135static JSVM_CallbackStruct param[] = { 136 {.data = nullptr, .callback = IsDate}, 137}; 138static JSVM_CallbackStruct *method = param; 139// CreateDate方法别名,供JS调用 140static JSVM_PropertyDescriptor descriptor[] = { 141 {"isDate", nullptr, method, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 142}; 143// 样例测试js 144const char *srcCallNative = R"JS(isDate(new Date(Date.now())))JS"; 145``` 146