是否有一些v8函数可以从字符串中创建C ++ v8 :: Date对象,例如" 2015-02-20"没有从C ++执行JS?

时间:2015-12-08 14:23:18

标签: javascript c++ v8

JavaScript的日期构造函数可以解析字符串以创建日期:

var date = new Date("2015");
console.log(date); // Thu Jan 01 2015 06:00:00 GMT+0600 (NOVT)
console.log(date.getTime()); // 1420070400000

我需要在我的C ++ Node.js插件中进行类似的解析(迄今为止的字符串)。 我找到了两种获得v8的方法:日期:

  • static Local<Value> Date::New(Isolate* isolate, double time)。这需要一个双倍的价值。

  • static Date* Date::Cast(v8::Value* obj)但它很容易将字符串转换为double:

v8::Local<v8::String> str = Nan::New("2015").ToLocalChecked();
v8::Date *castDate = v8::Date::Cast(*str);
double castVal = castDate->NumberValue();
printf("%f\n", castVal); // 2015.000000, not 1420070400000 :(

v8::Local<v8::Date> newDate = 
    v8::Date::New(info.GetIsolate(), 2015).As<v8::Date>();
double newVal = newDate->NumberValue();
printf("%f\n", newVal); // 2015.000000

v8中有哪些方法可以从字符串创建C ++ v8 :: Date?

更新(2016.01.05):

我添加了#34;没有来自C ++和#34的JS执行;问题标题。

2 个答案:

答案 0 :(得分:1)

如何使用一次性v8::Script来解析字符串? (免责声明:代码未经测试)

v8::Handle<v8::String> source = v8::String::New("new Date('2016-01-04')");
v8::Handle<v8::Script> script = v8::Script::Compile(source);
v8::Handle<v8::Value> result = script->Run();

答案 1 :(得分:1)

我想了一下开箱即用,并提出了一些诡计:

v8::Local<v8::Date> tmp = Nan::New<v8::Date>(0).ToLocalChecked();
v8::Local<v8::Function> cons = v8::Local<v8::Function>::Cast(
    Nan::Get(tmp, Nan::New("constructor").ToLocalChecked()).ToLocalChecked()
);

const int argc = 1;
v8::Local<v8::Value> argv[argc] = {Nan::New("2015").ToLocalChecked()};
v8::Local<v8::Date> date = v8::Local<v8::Date>::Cast(
    Nan::NewInstance(cons, argc, argv).ToLocalChecked()
);

首先,我创建一个任意Date对象,然后我提取构造函数,然后用它来有效地调用new Date("2015")

您还可以在类中保留构造函数,以便在频繁使用时提高效率。