duration 重新实现