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