• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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