You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中生成带微秒的DateTime?适配Postgres timestampz

解决Flutter生成带微秒DateTime的问题

Flutter的DateTime类本身支持微秒精度,只是DateTime.now()默认只返回毫秒精度的时间。针对你的需求,有几种可行方案:

方案一:通过原生通道获取系统高精度时间

利用Flutter的MethodChannel调用Android/iOS原生API,获取带微秒精度的时间戳,再转换为DateTime:

Android端实现

class MainActivity : FlutterActivity() {
    private val CHANNEL = "highres.time.channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getMicrosecTimestamp") {
                val microsec = System.nanoTime() / 1000
                result.success(microsec)
            } else {
                result.notImplemented()
            }
        }
    }
}

iOS端实现

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let controller = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: "highres.time.channel", binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler { call, result in
            if call.method == "getMicrosecTimestamp" {
                let microsec = UInt64(Date().timeIntervalSince1970 * 1_000_000)
                result(microsec)
            } else {
                result(FlutterMethodNotImplemented)
            }
        }
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

Flutter端调用

import 'package:flutter/services.dart';

Future<DateTime> getHighResDateTime() async {
  const platform = MethodChannel('highres.time.channel');
  try {
    final int microsec = await platform.invokeMethod('getMicrosecTimestamp');
    return DateTime.fromMicrosecondsSinceEpoch(microsec);
  } on PlatformException catch (e) {
    throw Exception("获取高精度时间失败: ${e.message}");
  }
}

// 使用示例
DateTime microsecTime = await getHighResDateTime();

方案二:随机补全微秒(适合分组场景)

如果不需要严格的系统微秒精度,仅为了和Postgres格式对齐做分组,可以直接在DateTime.now()基础上补随机微秒:

import 'dart:math';

DateTime nowWithMicrosec() {
  final base = DateTime.now();
  final randomMicrosec = Random().nextInt(1000);
  return DateTime(
    base.year,
    base.month,
    base.day,
    base.hour,
    base.minute,
    base.second,
    base.millisecond,
    randomMicrosec,
  );
}

这种方式无需原生交互,足够满足分组需求,避免额外的数据库读写操作。

方案三:统一在数据库生成时间戳

如果不想在Flutter端处理,可以在Postgres中创建稳定函数,插入多行时统一调用该函数生成时间戳:

CREATE OR REPLACE FUNCTION get_group_timestamp()
RETURNS TIMESTAMPTZ AS $$
BEGIN
  RETURN NOW();
END;
$$ LANGUAGE plpgsql STABLE;

插入数据时,所有同组行的timestampz字段都使用get_group_timestamp(),确保时间戳完全一致。


内容的提问来源于stack exchange,提问作者Sunil Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:01:07